为了账号安全,请及时绑定邮箱和手机立即绑定

多线程与线程Python

多线程与线程Python

汪汪一只猫 2019-06-01 15:21:32
多线程与线程Python我在努力理解多处理过关穿线..我知道多处理绕过Global解释器锁,但是还有什么其他的优势,并且可以穿线不做同样的事?
查看完整描述

4 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

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

多处理

行家

  • 分离内存空间
  • 代码通常很简单
  • 利用多个CPU和核心
  • 避免cPython的Gil限制
  • 消除了对同步原语的大多数需求,除非您使用共享内存(相反,它更像是IPC的通信模型)
  • 子进程是可中断/可杀死的。
  • Python

    multiprocessing

    模块包含了与接口非常类似的有用的抽象。

    threading.Thread

  • 必须与cPython一起进行cpu绑定处理。

反方

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

穿线

行家

  • 轻量级-低内存占用空间
  • 共享内存-使从另一个上下文访问状态更容易。
  • 允许您轻松地做出响应性的UI。
  • 正确释放GIL的cPythonC扩展模块将并行运行
  • I/O绑定应用程序的最佳选择

反方

  • cPython-服从GIL
  • 不可中断的/可杀死的
  • 如果没有遵循命令队列/消息泵模型(使用

    Queue

    ),然后手动使用同步原语就成了必要的(锁定的粒度需要决策)。
  • 代码通常更难理解和正确-竞赛条件的潜力急剧增加。


查看完整回答
反对 回复 2019-06-01
?
四季花海

TA贡献1811条经验 获得超5个赞

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

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

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


查看完整回答
反对 回复 2019-06-01
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

关键的优势是与世隔绝。崩溃进程不会破坏其他进程,而崩溃线程可能会对其他线程造成严重破坏。


查看完整回答
反对 回复 2019-06-01
  • 4 回答
  • 0 关注
  • 610 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信