Python 3 中的多处理与多线程与异步

新手上路,请多包涵

我发现在 Python 3.4 中,有几个不同的库用于多处理/线程: 多处理线程asyncio

但我不知道使用哪一个或者是“推荐的”。他们做同样的事情,还是不同?如果是这样,哪一个用于什么?我想编写一个在我的计算机中使用多核的程序。但是不知道该学哪个库。

原文由 user3654650 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 849
2 个回答

它们用于(略有)不同的目的和/或要求。 CPython(典型的主线 Python 实现)仍然具有 全局解释器锁,因此多线程应用程序(如今实现并行处理的标准方法)不是最佳选择。这就是为什么 multiprocessing 可能 优于 threading 的原因。但并非每个问题都可以有效地拆分为 [几乎独立的] 部分,因此可能需要进行繁重的进程间通信。这就是为什么 multiprocessing 通常不会优于 threading 的原因。

asyncio (此技术不仅在 Python 中可用,其他语言和/或框架也有它,例如 Boost.ASIO )是一种有效处理来自许多同步源的大量 I/O 操作的方法 w /o 需要并行代码执行。所以它只是针对特定任务的解决方案(确实是一个很好的解决方案!),而不是一般的并行处理。

原文由 user3159253 发布,翻译遵循 CC BY-SA 3.0 许可协议

长话短说

做出正确的选择:

我们已经介绍了最流行的并发形式。但问题仍然存在——什么时候应该选择哪一个?这实际上取决于用例。根据我的经验(和阅读),我倾向于遵循以下伪代码:

 if io_bound:
    if io_very_slow:
        print("Use Asyncio")
    else:
        print("Use Threads")
else:
    print("Multi Processing")

  • CPU 绑定 => 多处理
  • I/O 绑定、快速 I/O、连接数有限 => 多线程
  • I/O 绑定、慢速 I/O、许多连接 => Asyncio

参考


[ 注意]:

  • 如果您有一个长调用方法(例如,一个包含休眠时间或惰性 I/O 的方法),最好的选择是 asyncioTwistedTornado 方法(协程方法),它们与单线程一起作为并发工作。
  • asyncio 适用于 Python3.4 及更高版本。
  • TornadoTwistedPython2.7 开始准备就绪
  • uvloop 超快 asyncio 事件循环( uvloop 使 asyncio 快 2-4 倍)。

[更新(2019 年)]:

  • Japranto ( GitHub )是一个基于 uvloop 的非常快速的流水线 HTTP 服务器。

原文由 Benyamin Jafari - aGn 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题