一个解释性语言如何避免使用全局解释器锁(GIL)?

7

CPython使用全局解释器锁。Linux已经删除了大内核锁的所有痕迹。那么这些锁的替代方案是什么?如何使系统充分利用真正的多核或多处理器系统而不使所有进程陷入停顿?


2
在相关栏目下有几篇重复的文章,例如https://dev59.com/BHVC5IYBdhLWcg3whRkw。请注意避免重复。 - typo.pl
2
Jython和IronPython没有GIL。 - Iacks
1
@Rook,Typo的链接中的第一个答案解释了GIL的替代方案可能是什么。 - NullUserException
1
我不理解将CPython与Linux进行比较。那是不可比较的。 - David Heffernan
1
@Rook。还要阅读这个:https://dev59.com/zXNA5IYBdhLWcg3wWsiK#991917 - NullUserException
显示剩余4条评论
4个回答

4
如果Python使用类似IBM的Recycler这样更先进的垃圾回收器,而不是原始的引用计数方法,那么就不需要GIL了。这是Unladen Swallow正在做的事情,以提高Python的性能。一种更有前途的解决方案是Stackless Python,它使用自己的微线程实现,而不像传统的CPython那样依赖于操作系统。

除非Unladen Swallow已经死了,否则不行。 - Nicholas Riley
我添加了一条评论,而不是答案...关键是有人可能会根据你的回答期望CPython的GIL很快就会消失。但事实并非如此。 - Nicholas Riley
将Python的引用计数作为原子操作(通过适当的汇编指令)是否可行?(我假设这并不简单,否则他们早就这么做了) - Jeremy Friesner
1
没错,曾经尝试过使用Unladen Swallow,但它已经被放弃了。似乎这需要太多的工作,所以开发人员转而创建了另一种语言(Go)。 - Keith
@Keith 现在这很有趣。 - rook
PyPy 是正在开发中的新型更快的 Python,得到了 Psyco 的创造者的帮助。它比 Unladen 快了三倍以上,但还不及 Cython 或 Shed Skin:http://geetduggal.wordpress.com/2010/11/25/speed-up-your-python-unladen-vs-shedskin-vs-pypy-vs-c/。 - Cees Timmerman

2

GIL是进程特定的,因此您可以通过启动多个Python进程来避免它。 multiprocessing模块提供了一个易于使用的API。

另一种方法是使用C扩展(或编写自己的扩展程序),在进行所需数据处理时释放GIL。


1
我正在询问解释器如何避免使用 GIL。 - rook

1

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


1
但是GIL是为解释语言的实现而设计的,而不是其中的代码,对吧?Haskell通常是编译型的,编译器可以使用非函数式语言。即使在Python中禁止使用列表并且每个人都必须使用元组,它仍然需要垃圾回收等功能,不是吗? - Mark

0

你可以通过增加更多的细粒度锁或使用不需要锁的原子操作来消除GIL,就像Linux开发人员消除Big Kernel Lock一样。

然而,Python没有这么做的主要原因是性能问题。例如,Tcl解释器没有GIL,但可以编译为线程化和非线程化版本。如果使用线程化版本,则性能比单线程情况下低10-20%。因此,除非使用线程,否则实际上会更慢。曾经有Python补丁添加了较小的锁,但它们的性能影响更糟糕,因此被拒绝了。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接