Python的GIL真的是每个解释器独立的吗?
我经常看到有人说GIL是每个Python解释器独有的(在StackOverflow上也有类似讨论)。
但从源代码来看,GIL似乎是一个全局变量,这意味着在每个Python进程中,所有的解释器共享同一个GIL。我知道这样设计是因为Python没有像Lua或TCL那样传递解释器对象,最开始的设计就有点问题。而且,线程本地存储对Python开发者来说似乎也不太好用。
这样理解对吗?我在这里看了一下我项目中使用的2.4版本。
在后来的版本中,特别是3.0版本,有没有什么变化?
3 个回答
我相信在Python 2.6及之前的版本中,每个进程最多只能嵌入一个CPython解释器(其他运行环境可能有不同的限制)。我不太确定这是否与全局解释器锁(GIL)直接相关,但很可能是因为全局状态的问题,或者是为了防止第三方C模块之间的全局状态冲突。从CPython API文档中可以看到:
[Py___Initialize()]在第二次调用时不会执行任何操作(前提是没有先调用Py_Finalize())。它没有返回值;如果初始化失败,这将是一个致命错误。
你可能会对Unladen Swallow项目感兴趣,该项目的目标是最终完全去掉CPython中的GIL。其他一些Python运行环境根本没有GIL,比如我相信的Stackless Python,还有Jython肯定是没有的。
另外要注意的是,GIL在CPython 3.x中仍然存在。
可能大家会感到困惑,因为大多数人认为每个进程只有一个Python解释器。我记得曾经看到过,Python通过C接口支持多个解释器的功能基本上没有经过测试,而且几乎没人用过。(我自己尝试了一下,结果也没正常工作。)
全局解释器锁(GIL)是针对每个进程的,而不是针对每个解释器的。在3.x版本中,这一点没有改变。