繁体   English   中英

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

[英]multithreading for IO-bound tasks and multiprocessing for CPU-bound tasks

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

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

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

正如 Go 语言的共同发明者 Rob Pike 所说:

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

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

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

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

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

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

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

我找到了一篇可以帮助您处理并发和异步 I/O 的文章

Python 中的并发与异步 I/O

要在 Python 中实现并行性,您需要绕过 GIL。 一个有助于解决这个问题的 python 模块称为“多处理”。

关于你的疑惑:

...(它说多处理适用于 CPU 密集型任务,多线程适用于 IO 密集型任务)仅适用于 Python 环境。

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

David Beazley 和 Łukasz Langa 在下面的谈话中都提到了这个事实

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

  • David Beazley, Curious Course on Coroutines and Concurrency

  • Łukasz Langa,协程思考 - PyCon 2016

链接也在下面的演示文稿中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM