多处理与线程 Python多处理线程

2022-09-05 01:12:22

我试图理解多处理相对于线程的优势。我知道多处理绕过了全局解释器锁,但是还有什么其他优点,线程不能做同样的事情吗?


答案 1

以下是我想出的一些优点/缺点。

多处理

优点

  • 独立的内存空间
  • 代码通常很简单
  • 利用多个 CPU 和内核
  • 避免了 cPython 的 GIL 限制
  • 消除了对同步原语的大多数需求,除非您使用共享内存(相反,它更像是IPC的通信模型)
  • 子进程是可中断/可终止的
  • Python模块包括有用的抽象,其接口很像multiprocessingthreading.Thread
  • 必须使用 cPython 进行 CPU 密集型处理

缺点

  • IPC稍微复杂一些,开销更大(通信模型与共享内存/对象)
  • 更大的内存占用量

线程

优点

  • 轻量级 - 低内存占用
  • 共享内存 - 使从另一个上下文访问状态更容易
  • 允许您轻松制作响应式 UI
  • 正确发布 GIL 的 cPython C 扩展模块将并行运行
  • I/O 密集型应用程序的绝佳选择

缺点

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

答案 2

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

生成过程比生成线程慢一些。