Ala*_*sta 6 python concurrency
https://realpython.com/async-io-python/给出了关于多线程和多处理的介绍,但它没有明确什么是一般有效的或仅在Python环境中有效的。例如,它说:
并发性包括多处理(适合 CPU 密集型任务)和线程(适合 IO 密集型任务)
我之前曾使用其他编程语言(例如 C/C++)开发过并发应用程序,这种说法对我来说似乎很奇怪。为什么多线程不适合 CPU 密集型任务,而多处理通常不适合 IO 密集型任务?据我所知,两者都可以有效地用于这两项任务。在两者之间做出选择取决于其他标准,例如任务粒度、共享状态量和任务之间的执行顺序依赖性以及进程/线程创建成本(进程较高,尤其是在某些操作系统中)。上面的语句是否特定于 Python 环境及其全局锁解释器限制?
正如 Go 语言联合发明人 Rob Pike 所说:
\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正如你所看到的,你有 3 种并发方式,但由于 GIL 限制,你不能在并行任务或 CPU 密集型任务中使用它
\n\n我发现一篇文章可以帮助您了解并发和异步 I/O
\n\n\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\nDavid Beazley 和 \xc5\x81ukasz Langa 在下面的演讲中都提到了这一事实
\n\nDavid Beazley,2015 年 PyCon 巴西站主题演讲
David Beazley,关于协程和并发的好奇课程
\xc5\x81ukasz Langa,协程思考 - PyCon 2016
链接也在下面的演示中
\n