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。
问题
- PEP 703 引入
--disable-gil
来创建一个没有 GIL 的 Python 版本。
但是会导致以后部分 Python 库的开发需要提供两种包文件,运行在 nogil 上的版本,和运行在 GIL 上的版本。
参考资料与拓展阅读
- 2021-11-14,Python 官方研讨会:彻底移除 GIL 真的可行么?
- 2022-05-18,Python 新提案:删除全局解释器锁 GIL,解放多线程性能
- 2023-01-12,Python 新提案:使全局解释器锁成为可选项
- 2023-07-10,Meta 积极推动 Python 项目采纳 PEP 703 提案,让全局解释器锁成为可选
- https://github.com/colesbury/nogil