CPython 使用全局解释器锁。Linux 已经删除了Big Kernel Lock的所有痕迹。这些锁的替代品是什么?一个系统如何才能充分利用真正的多核或多处理器系统而不使一切都陷入停顿?
4 回答
如果 python 使用更高级的垃圾收集器(如IBM 的 Recycler)并使用原始引用计数方法,则不需要 GIL 。这是Unladen Swallow为提高 python 性能所做的事情。一个更有希望的答案是Stackless Python,它使用自己的微线程实现,而不是像传统的 CPython 那样依赖操作系统。
GIL 是特定于进程的,因此您可以通过启动多个 Python 进程来绕过它。多处理模块为此提供了一个易于使用的 API。
另一种方法是使用 C 扩展(或编写您自己的)来释放 GIL,同时进行所需的数据处理。
简单的。没有可变状态,就像 Haskell 和其他函数式编程语言一样。由于不需要更改内存中的任何内容,因此不需要全局锁。
您可以像 Linux 人员摆脱 Big Kernel Lock 的方式一样摆脱 GIL:只需添加许多更细粒度的锁或使用不需要锁的原子原语。
Python 不这样做的缺点和主要原因是性能。例如,Tcl 解释器没有 GIL,但可以编译线程和非线程,如果使用线程版本,则性能比单线程情况低 10-20%。因此,除非您使用线程,否则它实际上会更慢。有一些 Python 补丁可以添加更小的锁,但这些补丁对性能的影响更差,因此被拒绝了。
这只是一个权衡,python 开发人员认为单线程性能(以及与 C 扩展的向后兼容性)比在 python 级别上使用多线程的选项更重要。您仍然可以在 C 扩展中自由使用线程,只是在 python 语言级别上没有意义。