多处理vs线程Python

2024-04-24 16:50:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解multiprocessingthreading的优势。我知道多处理可以绕过全局解释器锁,但是还有什么其他的优点,可以不做相同的事情?


Tags: 全局事情multiprocessing解释器优点threading优势
3条回答

以下是我提出的一些利弊。

多处理

专业人士

  • 分开存储空间
  • 代码通常很简单
  • 利用多个CPU和核心
  • 避免了cPython的GIL限制
  • 消除了对同步原语的大多数需求,除非使用共享内存(相反,它更像是IPC的通信模型)
  • 子进程是可中断/可终止的
  • Pythonmultiprocessing模块包含有用的抽象,其接口非常类似于threading.Thread
  • 必须使用cPython进行CPU绑定处理

缺点

  • IPC有点复杂,但开销更大(通信模型vs.共享内存/对象)
  • 更大的内存占用

穿线

专业人士

  • 轻量级-低内存占用
  • 共享内存-使从另一个上下文访问状态更容易
  • 使您能够轻松地制作响应式用户界面
  • 正确释放GIL的cPython C扩展模块将并行运行
  • 非常适合I/O绑定应用程序

缺点

  • cPython-受GIL约束
  • 不可中断/可杀死
  • 如果不遵循命令队列/消息泵模型(使用Queue模块),则需要手动使用同步原语(锁定的粒度需要决定)
  • 代码通常很难理解和正确理解-竞争条件的可能性急剧增加

threading模块使用线程,multiprocessing模块使用进程。不同之处在于线程在相同的内存空间中运行,而进程有单独的内存。这使得在具有多处理的进程之间共享对象有点困难。由于线程使用相同的内存,因此必须采取预防措施,否则两个线程将同时写入同一内存。这就是全局解释器锁的作用。

生成进程比生成线程慢一点。一旦它们开始运行,就没有什么区别了。

线程的工作是使应用程序能够响应。假设您有一个数据库连接,并且需要响应用户输入。如果没有线程,如果数据库连接正忙,应用程序将无法响应用户。通过将数据库连接拆分为单独的线程,可以使应用程序更具响应性。另外,由于两个线程处于相同的进程中,它们可以访问相同的数据结构—良好的性能,外加灵活的软件设计。

注意,由于GIL的存在,应用程序实际上并没有同时做两件事,但是我们所做的是将数据库上的资源锁放在一个单独的线程中,以便在它和用户交互之间切换CPU时间。CPU时间在线程之间分配。

多处理是指当你真的想在任何给定的时间做不止一件事情的时候。假设您的应用程序需要连接到6个数据库,并对每个数据集执行复杂的矩阵转换。将每个作业放在一个单独的线程中可能会有一些帮助,因为当一个连接空闲时,另一个连接可以获得一些CPU时间,但处理不会并行完成,因为GIL意味着您只使用了一个CPU的资源。通过将每个作业放在一个多处理进程中,每个作业都可以在自己的CPU上运行,并以最高效率运行。

相关问题 更多 >