[英]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 中,您可以通过以下方式实现并发:
正如你所看到的,你有 3 种并发方式,但由于 GIL 的限制,你不能在并行任务或 CPU 密集型任务中使用它
我找到了一篇可以帮助您处理并发和异步 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.