12

我经常看到人们说 GIL 是基于 Python 解释器的(即使在 stackoverflow 上也是如此)。

但是我在源代码中看到的似乎是 GIL 是一个全局变量,因此每个 python 进程中的所有解释器都有一个 GIL。我知道他们这样做是因为没有像 lua 或 TCL 那样传递的解释器对象,只是一开始设计得不好。并且线程本地存储对于 python 家伙来说似乎是不可移植的。

它是否正确?我在这里简要了解了我在项目中使用的 2.4 版本。

这在以后的版本中是否发生了变化,尤其是在 3.0 中?

4

3 回答 3

12

GIL 确实是每个进程,而不是每个解释器。这在 3.x 中没有变化。

于 2009-10-18T20:25:55.627 回答
3

也许是因为大多数人认为 Python 的每个进程都有一个解释器,所以产生了混淆。我记得读过通过 C API 对多个解释器的支持在很大程度上未经测试并且几乎从未使用过。(当我试一试时,没有正常工作。)

于 2009-10-18T18:24:19.927 回答
0

我相信确实(至少从 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中。

于 2009-10-18T16:09:25.013 回答