Python 3.4中的多处理vs多线程vs异步

2024-09-24 22:25:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我发现在Python 3.4中,很少有用于多处理/线程的不同库:multiprocessingvsthreadingvsasyncio

但我不知道该用哪一个或是“推荐的”。他们做的是同一件事,还是不同?如果是,哪一个用来做什么?我想写一个在我的电脑中使用多核的程序。但我不知道该学哪个图书馆。


Tags: 程序图书馆线程电脑multiprocessingvsthreadingvsasyncio
3条回答

它们用于(稍微)不同的目的和/或要求。CPython(一个典型的主线Python实现)仍然具有global interpreter lock,因此多线程应用程序(现在实现并行处理的标准方法)是次优的。这就是为什么multiprocessing可能比^{>更受欢迎。但并不是每个问题都可以有效地分成[几乎独立的]部分,所以可能需要大量的进程间通信。这就是为什么multiprocessing通常不比threading更受欢迎的原因。

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

[快速回答]

TL;博士


做出正确的选择:

We have walked through the most popular forms of concurrency. But the question remains - when should choose which one? It really depends on the use cases. From my experience (and reading), I tend to follow this pseudo code:

if io_bound:
    if io_very_slow:
        print("Use Asyncio")
    else:
        print("Use Threads")
else:
    print("Multi Processing")
  • CPU Bound => Multi Processing
  • I/O Bound, Fast I/O, Limited Number of Connections => Multi Threading
  • I/O Bound, Slow I/O, Many connections => Asyncio

Reference


[注意:

  • 如果您有一个长的调用方法(即包含睡眠时间或延迟i/O的方法),最好的选择是asyncioTwistedTornado方法(协程方法),它将单线程用作并发。
  • asyncio作用于Python3.4及以后。
  • TornadoTwisted已经准备好了,因为Python2.7
  • uvloop是超快的asyncio事件循环(uvloop使asyncio2-4x更快)。

【更新(2019年)】:

  • japantoGitHub是一个非常快速的基于uvloop的管道HTTP服务器。

这是基本思想:

Is it IO-BOUND ? ---------> USE asyncio

IS IT CPU-HEAVY ? -----> USE multiprocessing

ELSE ? ----------------------> USE threading

所以基本上要坚持线程化,除非有IO/CPU问题。

相关问题 更多 >