来自PEP-492的协同程序是否绕过Python 3.5中的GIL?

时间:2015-07-07 22:02:06

标签: python coroutine gil

Python 3.5包括PEP-492的协同例程支持;这是伟大的,所有....假设协同程序围绕GIL;有谁知道这是不是这样的?或者,我应该继续使用multiprocessing模块吗?

1 个答案:

答案 0 :(得分:1)

我想说,协同程序不会绕过GIL。

原因是,协同程序永远不会并行处理。协同程序是一种语言功能,它可以执行某种伪并行处理,而无需真正的并行任务,线程或其他任何执行。一次只执行一个协程。

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

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

当你使用支持线程的Python版本时,你将拥有GIL - 没有线程也没有协同程序&#34;绕过&#34; GIL。但协同程序不受GIL的影响,因为线程可以在进入关键部分时由GIL阻止线程。协程不是,除非第二个线程正在运行...(但这是程序中线程的问题,而不是协程的问题)。

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

但是你必须确定,你正在使用的模块没有使用线程,因为该模块会破坏。

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

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

还有网络服务器&#34; Tornado&#34;现在在Python中使用协同处理技术的时间非常长,非常成功。这应该表明,当使用Python时,协同处理绝对是一个不错的选择。此外,通过使用协处理技术(例如Nginx),还有其他快速程序的例子。