最佳答案
我会说,协程不会绕过 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/