Python 3.12 将能够使用不共享 GIL 的解释器


自 Python 1.5(1997 年)以来,PyInterpreterState 结构就被添加到了 CPython,允许开发者在一个进程中同时运行多个 Python 解释器。然而,多个解释器在同一进程中运行时,并不能真正地相互隔离。同一进程中的解释器始终共享大量全局状态。这是很多错误的来源,随着越来越多的人使用该功能,其影响也越来越大。

造成这个情况的主要原因就是由于 GIL(全局解释器锁),这是 CPython 的一个核心特性,而为了解决这个问题就有开发者曾提出过删除全局解释器锁 GIL 的提议。除此之外,另一个显而易见的方法则是建立每一个解释器的 GIL:为进程中产生的每一个解释器建立一个单独的锁。

因此在去年 3 月,开发者 Eric Snow 就提出了一个针对每个解释器的全局解释器锁(A Per-Interpreter GIL),通过充分的隔离有助于实现真正的多核并行,其中的解释器不再共享 GIL。

Eric Snow 在提议中表示:

有了每个解释器的 GIL,CPython 将能够为在不同解释器中运行的代码实现真正的多核并行性。

经过一年多时间的讨论,日前 CPython 的核心开发者 Emily Morehouse 代表指导委员会正式接受了这个提议(PEP 684),Eric Snow 仍然以 Python 3.12 为目标,希望能在该版本中看到每个解释器的 GIL,Python 3.12 预计将于今年 10 月发布。

然而,实现每个解释器的 GIL 不是一个小任务。一般来说,在多个解释器之间共享的任何可变状态都必须由锁来保护。这意味着,如果要为每一个解释器建立一个单独的锁,那么多个解释器之间共享的状态数量必须降到绝对最低。适当地隔离解释器需要将大部分 CPython 运行时状态存储在 PyInterpreterState 结构中。目前,只有其中的一部分是这样的,其中大部分都需要被移动。

关于这个提议的更多详情可以查看 GitHub 的 PR 和 Python 社区的讨论。


相關推薦

2023-07-11

的是 Making the Global Interpreter Lock Optional in CPython,让全局解释器锁在 CPython 中成为可选。 该提案建议向 CPython 添加构建配置 (--disable-gil),使其在没有全局解释器锁的情况下运行 Python 代码,并进行必要的更改以保证解释器线程

2022-05-18

2022 Python 语言峰会上带来了一个新提案:完全移除 CPython 解释器的 GIL- 全局解释器锁,使 Python 程序获得更快的性能 —— 尤其是多线程程序。 Python 有多个版本,包括 JVM 、 .NET CLR  解释器以及编译器,但该语言的核心实现

2023-01-13

言峰会上,开发者 Sam Gross 带来了新提案:删除全局解释器锁 GIL,解放多线程性能。但由于 GIL 历史悠久,许多官方/非官方的 Python 包和模块都深度融合了 GIL 模块,彻底移除 GIL 功能可能会对生态造成影响。在 2023 年 1

2023-10-27

。 PEP 703(Making the Global Interpreter Lock Optional,让全局解释器锁成为可选),简称 no-GIL,也被称为自由线程 (free-threaded)。 根据提案的描述,CPython 的全局解释器锁 (GIL) 阻止了同时多线程执行代码,成为了在多核 CPU 上

2022-05-19

快的运行时,这些优化大部分来自于 PEP 659  :自适应解释器,它运作思路跟 JIT 有点相似,都是识别热点代码,但自适应解释器的工作范围无法脱离字节码。目前 PEP 659 提案的工作基本完成,但 for 循环和二进制操作的动态

2022-12-08

日志中 3.8 - 3.12:gh-87604:避免通过gc 模块发布每个解释器的活跃审计 hook 列表 3.7 - 3.10:gh-98517:移植 XKCP 对 SHA-3 中缓冲区溢出的修复,以修复 CVE-2022-37454 问题 3.7 - 3.9:gh-68966:已弃用的 mailcap 模块现在拒绝将

2023-07-22

的一个有保证的稳定子集,专门用于 Cython 经常 hook Python 解释器的工作类型。Cython 3 已初步支持 limited API,且这种支持还在不断增加。InfoWorld 指出,从长远来看,这意味着为某一版本 Python 构建的 Cython 扩展模块可以在未来版本

2022-11-07

Python 3.12.0 首个 alpha 版本已发布,这是 Python 3.12 的早期开发者预览版。 目前 Python 3.12 处于开发阶段,3.12.0a1 是计划中的七个 alpha 版本中的第一个,许多新特性仍在计划和编写之中。下面简单介绍与 3.11 相比,3.12 系列的主

2022-11-17

Python 3.12.0 第二个 alpha 版本已发布,这是 Python 3.12 的早期开发者预览版。 目前 Python 3.12 处于开发阶段,3.12.0a2 是计划中的七个 alpha 版本中的第二个,许多新特性仍在计划和编写之中。下面简单介绍与 3.11 相比,3.12 系列的

2023-01-12

Python 3.12.0 第四个 alpha 版本已发布,这是 Python 3.12 的早期开发者预览版。 目前 Python 3.12 处于开发阶段,3.12.0a4 是计划的七个 alpha 版本中的第四个,许多新特性仍在计划和编写之中。下面简单介绍与 3.11 相比,3.12 系列的主

2022-12-04

库配合使用,让您可以在编写代码期间直接自定义 Conda 解释器。 通过设置使用新 PyCharm UI 切换到新 UI,预览 PyCharm 完全重做的外观。 勾选 Settings/Preferences | Appearance & Behavior(设置/偏好设置 | 外观与行为)中的 New UI preview

2023-08-08

Python 3.12.0 发布了第 1 个 RC 版本。 开发团队表示,进入候选版本阶段后,只接受经过 review 且修复明确错误的代码。RC2(也是最后一个候选版本)计划于 2023 年 9 月 4 日发布,而 3.12.0 的正式版本计划于 2023 年 10 月 2 日发布。

2023-10-02

空的 base_namespace 选项值以修复#34113。( #34137 ) Python [Python 3.12] 支持Python 3.12。( #34398 ) [Python 3.12] 弃用 distutil。( #34186 ) Ruby [ruby] 修复 x86-darwin 上的链接错误。( #34134 ) [Ruby] 将 strdup 替

2023-09-08

Google 开发者在线课程 开始学习 Python 3.12.0 发布了第 2 个 RC 版本,也是最后一个 RC。正式版将于 2023 年 10 月 2 日星期一发布。 开发团队表示,进入候选版本阶段后,只接受经过 review 且修复明确错误的代码。RC2 是发现并