python - PEP-492 中的协同程序会绕过 Python 3.5 中的 GIL 吗?

标签 python coroutine gil

Python 3.5 包括对 PEP-492 的协程支持;这太棒了……假设协同程序绕过 GIL ;有谁知道是不是这样?或者,我应该继续使用 multiprocessing 模块吗?

最佳答案

我会说,协程不会绕过 GIL。

原因是协程永远不会并行处理。协程是一种语言特性,它可以在没有真正的并行任务、线程或任何其他执行的情况下进行某种伪并行处理。一次只会执行一个协程。

请记住:即使在使用协程时,您的程序中仍然可以有不同的线程!

因此,GIL 不受影响,因为 GIL 只是一种防止 Python 解释器特定部分中的线程真正并行处理的方法,这可能会导致全局数据损坏。

当您使用支持线程的 Python 版本时,您将拥有 GIL——没有线程,也没有协程“绕过”GIL。但是协程不像线程那样受 GIL 的影响,因为线程在进入临界区时可能会被 GIL 停止。协同程序不是,除非第二个线程正在运行......(但这是程序中线程的问题,而不是协同程序的问题)。

当然,您可以(至少前段时间是可能的)创建一个没有线程支持的 Python 解释器版本(当您真的不需要它时),方法是您自己编译解释器。在这样的版本中,不应执行 GIL。

但是您必须确定,您正在使用的模块都没有使用线程,因为该模块会中断。

编辑: 第二次阅读您的问题后,我想您真正想问的是,GIL 开销(适用于线程)是否在协程中较低。

我会说,是的。即使 GIL 在您的解释器版本中处于事件状态。因为通过将您的执行限制为协作式多处理,GIL 将不会(或更少,当您仍然有多个线程时)影响您的协程,就像您有多个工作线程时一样。对保留 GIL 的争论将会减少(或没有)。

还有网络服务器“Tornado”,现在在 Python 中使用协处理技术已经很长时间了,非常成功。这应该表明,在使用 Python 时,协处理绝对是一个不错的选择。此外,还有其他一些使用协处理技术(例如 Nginx)运行速度很快的程序示例。

关于python - PEP-492 中的协同程序会绕过 Python 3.5 中的 GIL 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31280121/

相关文章:

Python 3.7 和 PyGILState_Ensure() (Windows)

python - 我需要在 Cython 中使用 `nogil`

python - 为什么 time.sleep(...) 不受 GIL 的影响?

python - 在Python中的内部字典中创建唯一键列表的更好方法

python - 组合列表元素

Kotlin Flow 仅每秒收集一次

parsing - 这个增量解析器是仿函数吗?如果是的话, `fmap` 将如何实现?

python - 根据日期将数据分成两半

python - Django:在事务中保存多个 ManyToMany 字段

python - 在 Python 中捕获生成器调用者抛出的异常