IO 密集型任务的多线程处理和 CPU 密集型任务的多处理

Ala*_*sta 6 python concurrency

https://realpython.com/async-io-python/给出了关于多线程和多处理的介绍,但它没有明确什么是一般有效的或仅在Python环境中有效的。例如,它说:

并发性包括多处理(适合 CPU 密集型任务)和线程(适合 IO 密集型任务)

我之前曾使用其他编程语言(例如 C/C++)开发过并发应用程序,这种说法对我来说似乎很奇怪。为什么多线程不适合 CPU 密集型任务,而多处理通常不适合 IO 密集型任务?据我所知,两者都可以有效地用于这两项任务。在两者之间做出选择取决于其他标准,例如任务粒度、共享状态量和任务之间的执行顺序依赖性以及进程/线程创建成本(进程较高,尤其是在某些操作系统中)。上面的语句是否特定于 Python 环境及其全局锁解释器限制?

Mas*_*use 8

正如 Go 语言联合发明人 Rob Pike 所说:

\n\n
    \n
  • 并发是指同时处理很多事情。
  • \n
  • 并行性是指同时做很多事情。
  • \n
  • 不相同但相关。
  • \n
  • 一是关于结构,一是关于执行。
  • \n
  • 并发提供了一种构建解决方案的方法来解决可能(但不一定)可并行的问题。
  • \n
\n\n

摘自 Luciano Ramalho 的书,“Fluent Python”第 18 章,第 557 页。

\n\n

他们想说的是,当您确实需要多个 CPU 密集型任务或并行任务时,多处理(它也是 Python 中用于并行性的库的名称)是解决问题的方法。\n在 Python 中,这是通过以下方式实现的使用Python 多处理模块等绕过 GIL

\n\n

在Python中,有一种叫做GIL的东西,它只允许一次运行一个线程。您需要绕过 GIL 才能使用并行性。\n同时,即使有 GIL 限制,您也可以实现并发:一次只能运行一个线程!

\n\n

在 Python 中,您可以通过以下方式实现并发:

\n\n
    \n
  • 线程,
  • \n
  • 期货(基于线程)
  • \n
  • 和异步 I/O(不是基于线程,而是事件循环和协作\n多任务)
  • \n
\n\n

正如你所看到的,你有 3 种并发方式,但由于 GIL 限制,你不能在并行任务或 CPU 密集型任务中使用它

\n\n

我发现一篇文章可以帮助您了解并发和异步 I/O

\n\n

Python 中的异步 I/O 并发

\n\n

要在 Python 中实现并行性,您需要绕过 GIL。\n有助于实现这一点的 Python 模块称为“多处理”。

\n\n

针对您的疑问:

\n\n

...(这表示多处理是 CPU 密集型任务的理想选择,多线程是 IO 密集型任务的理想选择)仅适用于 Python 环境。

\n\n

我不能说它是否只适用于 Python,因为我不知道所有其他语言,但例如 Javascript 因其异步 I/O 方法而臭名昭著,而 C#、C++、Java 实现并发和并行,没有任何不便或限制使用线程。C# 和 JavaScript 一样,很早以前就实现了异步 I/O。

\n\n

David Beazley 和 \xc5\x81ukasz Langa 在下面的演讲中都提到了这一事实

\n\n
    \n
  • David Beazley,2015 年 PyCon 巴西站主题演讲

  • \n
  • David Beazley,关于协程和并发的好奇课程

  • \n
  • \xc5\x81ukasz Langa,协程思考 - PyCon 2016

  • \n
\n\n

链接也在下面的演示中

\n