解释性语言如何避免使用Global Interpreter lock(GIL)?

时间:2011-03-03 07:34:22

标签: python linux multithreading gil

CPython使用Global Interpreter Lock。 Linux删除了Big Kernel Lock的所有痕迹。这些锁的替代品是什么?系统如何充分利用真正的多核或多处理器系统而不停止一切?

4 个答案:

答案 0 :(得分:4)

如果python使用更高级的垃圾收集器,如IBM's Recycler,则使用原始引用计数方法,则不需要GIL。这是Unladen Swallow正在做的改进python性能的东西。更有说服力的答案是Stackless Python,它使用自己的微线程实现,而不是像传统的CPython那样依赖于操作系统。

答案 1 :(得分:3)

GIL是特定于流程的,因此您可以通过启动多个Python流程来解决它。 multiprocessing module为此提供了一个易于使用的API。

另一种方法是使用C-extensions(或编写自己的)来释放GIL,同时进行所需的数据处理。

答案 2 :(得分:1)

简单。没有可变状态,就像Haskell和其他函数式编程语言一样。由于内存中的任何内容都不需要更改,因此不需要全局锁定。

答案 3 :(得分:0)

你可以像Linux家伙摆脱大内核锁一样摆脱GIL:只需添加更多细粒度锁或使用不需要锁的原子基元。

Python没有做到的缺点和主要原因是性能。例如,Tcl解释器没有GIL,但可以编译为线程和非线程,如果使用线程版本,性能比单线程情况低10-20%。因此,除非你使用线程,否则它实际上更慢。已经有Python补丁添加较小的锁,但是那些性能影响更大,因此被拒绝。

这只是一个权衡,python开发人员认为单线程性能(以及与C扩展的向后兼容性)比在python级别上使用许多线程的选项重要得多。您仍然可以在C扩展中自由使用线程,但在python语言级别上没有意义。