多进程与线程Python

我想了解多线程处理的优点。 我知道多处理技术可以解决Global Interpreter Lock问题,但是还有什么其他的优势,并且可以通过线程处理而不是做同样的事情?


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

产卵过程比产卵线程慢一点。 一旦他们跑步,没有太大的区别。


这是我提出的一些优点/缺点。

优点

  • 单独的内存空间
  • 代码通常很简单
  • 利用多个CPU和内核
  • 避免cPython的GIL限制
  • 消除同步原语的大多数需求,除非您使用共享内存(相反,它更像是IPC的通信模型)
  • 子进程是可中断的/可以进行的
  • Python multiprocessing模块包含有用的抽象接口,与threading.Thread非常相似
  • 必须用cPython进行CPU绑定处理
  • 缺点

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

    优点

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

  • cPython - 服从GIL
  • 不可中断/可驱动
  • 如果没有遵循命令队列/消息泵模型(使用Queue模块),则手动使用同步基元成为必需(需要确定锁定的粒度)
  • 代码通常很难理解并且正确 - 竞争条件的潜力急剧增加

  • 线程的工作是使应用程序能够响应。 假设你有一个数据库连接,你需要响应用户输入。 如果没有线程,如果数据库连接繁忙,应用程序将无法响应用户。 通过将数据库连接拆分为单独的线程,可以使应用程序更具响应性。 同样因为两个线程都处于相同的进程中,他们可以访问相同的数据结构 - 良好的性能,以及灵活的软件设计。

    请注意,由于GIL,应用程序实际上并不是同时做两件事,但我们所做的是将数据库上的资源锁放入单独的线程中,以便可以在它与用户交互之间切换CPU时间。 CPU时间在线程之间进行配给。

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

    链接地址: http://www.djcxy.com/p/1617.html

    上一篇: Multiprocessing vs Threading Python

    下一篇: Calling a function of a module by using its name (a string)