答案 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),还有其他快速程序的例子。