GIL是进程特定的,因此您可以通过启动多个Python进程来避免它。 multiprocessing模块提供了一个易于使用的API。
另一种方法是使用C扩展(或编写自己的扩展程序),在进行所需数据处理时释放GIL。
简单明了。与 Haskell 和其他函数式编程语言一样,它没有可变状态。由于不需要更改内存中的任何内容,因此永远不需要全局锁定。
你可以通过增加更多的细粒度锁或使用不需要锁的原子操作来消除GIL,就像Linux开发人员消除Big Kernel Lock一样。
然而,Python没有这么做的主要原因是性能问题。例如,Tcl解释器没有GIL,但可以编译为线程化和非线程化版本。如果使用线程化版本,则性能比单线程情况下低10-20%。因此,除非使用线程,否则实际上会更慢。曾经有Python补丁添加了较小的锁,但它们的性能影响更糟糕,因此被拒绝了。
这只是一个权衡,Python开发人员认为单线程性能(以及与C扩展的向后兼容性)比在Python级别上使用多个线程的选项更重要。您仍然可以在C扩展内自由地使用线程,但在Python语言级别上无法有意义地使用。