TOC

PEP 703 提案

Python 内部的 GIL(全局解释器锁)使 Python 的多线程开发变得更加简单,避免了大部分竞争条件,但是限制了 Python 进程使用多核心处理器,所有需要并行的场景全部受限。
官方建议,如果需要用到多核,那就选择多进程编程。

Python 出现的时候还没有多核 CPU,而现在多核心早就成为了主流,4 核、8 核太常见了。

因此从来不乏移除 GIL 的声音,不过没有一次成功。要想不对现有的项目造成太大的影响简直难于登天。
PS:几年前有一个叫做 Gilectomy 的项目(GIL Ectomy,GIL 切除术)因为导致 Python 性能下滑严重而失败。

最大的挑战是要保持对现有代码的兼容性,保住基本盘,也就是容易上手,容易开发。

  • 2021 年,香农计划成员 Eric Snow 提交 PEP 684 A Per-Interpreter GIL(每个解释器一个 GIL)。
    这应该是一个比较稳妥的方案,但我怀疑性价比是否足够。
    PS:和下面提到的 nogil 方案不冲突。

  • PEP 683 – Immortal Objects, Using a Fixed Refcount

  • PEP 554 – Multiple Interpreters in the Stdlib

  • 2021 年,Meta(Facebook)开发者 Sam Gross 基于 Python 3.9 创建了一个 nogil 的分支,最终证明了这个方案技术上可行,相较于 Gilectomy 单核性能没有收到太大的影响,拓展性也不错。

  • 2022 年 5 月,Sam Gross 在 Python 语言峰会上介绍了他的 nogil 项目,提议移除 GIL。
  • 2023 年 1 月,Sam Gross 又提交了一份新的提案 PEP 703 Making the Global Interpreter Lock Optional in CPython(使 GIL 成为可选项)。

现在是最接近移除 GIL 的时刻。
如果顺利通过,几年之后,我们就能用上没有 GIL 的 Python。

问题

  1. PEP 703 引入 --disable-gil 来创建一个没有 GIL 的 Python 版本。
    但是会导致以后部分 Python 库的开发需要提供两种包文件,运行在 nogil 上的版本,和运行在 GIL 上的版本。

参考资料与拓展阅读