【问题标题】:Is the Python GIL really per interpreter?Python GIL 真的是每个解释器吗?
【发布时间】:2010-12-07 19:07:11
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python multithreading gil


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这可能是因为大多数人认为 Python 每个进程都有一个解释器。我记得读过通过 C API 对多个解释器的支持在很大程度上未经测试,几乎从未使用过。 (当我试一试时,它不能正常工作。)

      【讨论】:

        【解决方案3】:

        我相信每个进程可能最多嵌入一个 CPython 解释器(其他运行时可能有不同的约束)是真的(至少从 Python 2.6 开始)。我不确定这是否是 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

        【讨论】:

        • 很多项目之前已经从 CPython 中删除了 GIL。空载燕子不是第一个。但是它们的性能不如 GIL 版本,因此没有人使用它们。
        • 此外,stackless 不会删除 GIL。事实上,任何无堆栈微线程中的任何阻塞操作都会阻塞整个应用程序。
        • 而且 Jython 太慢了,也无法使用 - 除非您只是将它用作 Java 程序的脚本插件,其中大部分工作都是在 Python 中完成的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-26
        • 2011-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多