多进程vs多线程vs异步I/O模型

16 浏览
0 Comments

多进程vs多线程vs异步I/O模型

我发现在Python 3.4中,有几个不同的多进程/多线程库:multiprocessingthreadingasyncio

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

admin 更改状态以发布 2023年5月24日
0
0 Comments

它们旨在用于不同的目的和/或要求。(典型的、主流的Python实现)CPython仍然具有全局解释器锁(GIL),因此多线程应用程序(现在实现并行处理的标准方式)是次优的。这就是为什么Multiprocessing可能比线程优先。但并不是每个问题都可以有效地分成[几乎独立的]部分,因此可能需要进行大量的进程间通信。这就是为什么Multiprocessing在一般情况下不一定优于线程。\nAsyncio(这个技术不仅在Python中可用,其他语言和/或框架也有它,例如Boost.ASIO)是一种有效处理许多同时来源的I/O操作的方法,无需并行代码执行。因此,它只是一个特定任务的解决方案(确实是一个很好的解决方案!),而不是一般的并行处理。

0
0 Comments

TL;DR

作出正确的选择:

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

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的方法),最好选择使用asyncio扭曲龙卷风方法(协程方法),它与单线程并发一起工作。
  • asyncio适用于Python3.4及更高版本。
  • 龙卷风扭曲从Python2.7开始使用。
  • uvloop是超快的asyncio事件循环(uvloop使asyncio快2-4倍)。

[更新(2019)]:

  • Japranto(GitHub)是基于uvloop的超快速流水线式HTTP服务器。
0