Python GIL真的是每个解释器吗?

时间:2009-10-18 15:35:24

标签: python multithreading gil

我经常看到人们在谈论GIL是根据Python解释器(甚至在stackoverflow上)。

但是我在源代码中看到的似乎是GIL是一个全局变量,因此每个python进程中的所有解释器都有一个GIL。我知道他们这样做是因为没有像lua或TCL那样传递的解释器对象,它在开始时设计得不好。并且线程本地存储似乎不适合python人员使用。

这是对的吗?我简要介绍了我在这个项目中使用的2.4版本。

在以后的版本中有没有改变,特别是在3.0?

3 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

我相信(至少从Python 2.6开始)每个进程最多可以嵌入一个CPython解释器(其他运行时可能有不同的约束)。我不确定这是否是GIL本身的问题,但可能是由于全局状态,或者是为了防止第三方C模块中的冲突全局状态。来自CPython API Docs

  

[Py ___ Initialize()]在第二次调用时是一个无操作(不首先调用Py_Finalize())。没有回报价值;如果初始化失败,则是致命错误。

您可能对Unladen Swallow项目感兴趣,该项目最终旨在从CPython中完全删除GIL。其他Python运行时根本没有GIL,比如(我相信)Stackless Python,当然还有Jython

另请注意,GIL为still present in CPython 3.x