我发现在 Python 3.4 中,有几个不同的库用于多处理/线程: 多处理、 线程 和 asyncio 。
但我不知道使用哪一个或者是“推荐的”。他们做同样的事情,还是不同?如果是这样,哪一个用于什么?我想编写一个在我的计算机中使用多核的程序。但是不知道该学哪个库。
原文由 user3654650 发布,翻译遵循 CC BY-SA 4.0 许可协议
我发现在 Python 3.4 中,有几个不同的库用于多处理/线程: 多处理、 线程 和 asyncio 。
但我不知道使用哪一个或者是“推荐的”。他们做同样的事情,还是不同?如果是这样,哪一个用于什么?我想编写一个在我的计算机中使用多核的程序。但是不知道该学哪个库。
原文由 user3654650 发布,翻译遵循 CC BY-SA 4.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
[ 注意]:
asyncio
事件循环( uvloop 使 asyncio
快 2-4 倍)。[更新(2019 年)]:
原文由 Benyamin Jafari - aGn 发布,翻译遵循 CC BY-SA 4.0 许可协议
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
它们用于(略有)不同的目的和/或要求。 CPython(典型的主线 Python 实现)仍然具有 全局解释器锁,因此多线程应用程序(如今实现并行处理的标准方法)不是最佳选择。这就是为什么
multiprocessing
可能 优于threading
的原因。但并非每个问题都可以有效地拆分为 [几乎独立的] 部分,因此可能需要进行繁重的进程间通信。这就是为什么multiprocessing
通常不会优于threading
的原因。asyncio
(此技术不仅在 Python 中可用,其他语言和/或框架也有它,例如 Boost.ASIO )是一种有效处理来自许多同步源的大量 I/O 操作的方法 w /o 需要并行代码执行。所以它只是针对特定任务的解决方案(确实是一个很好的解决方案!),而不是一般的并行处理。