python 真的有望告别 GIL 全局解释器锁?
Python 中有一把著名的锁——全局解释器锁(Global Interpreter Lock,简写 GIL),它的作用是防止多个本地线程同时执行 Python 字节码,这会导致 Python 无法实现真正的多线程执行。(注:本文中 Python 解释器特指 CPython)
这把锁在 Python 的早期发展中具有积极的作用(单核 CPU 时代),然而,它阻碍了 Python 在多核 CPU 上的并行编程,引起了开发者们与日俱增的诟病。
GIL 影响的主要是 CPU 密集型任务,比如科学计算与数值计算任务。
在最近发布的 PEP-703 中,它概括了 GIL 对科学计算(主要是 AI/ML)造成的四类问题:
- GIL 导致许多并行化操作难以表达(影响强化学习、DeepMind、医学治疗及生物研究等领域)
- GIL 影响了 Python 库的可用性(例如 PyTorch、scikit-learn、NumPy)
- GIL 导致无法充分利用 GPU 资源(例如计算机视觉任务)
- GIL 导致难以部署 Python AI 模型(例如基于神经网络的 AI 模型)
社区中想要移除 GIL 的呼声以及尝试,此起彼伏,绵绵不绝,但这个话题一直悬而未决。
抱怨、质疑、不满、不甘、期盼等这些诸多的情绪,不是那么容易平息的。然而,从一个积重已久的庞大的项目中移除一个根基性的设计,又谈何容易?
2023 新年刚过,这个话题又一次热了起来,又一轮对 GIL 的挑战开始了。
这一次,事情似乎有了新的转机,这次也许能成功了呢?
这个 PEP 的作者是 Sam Gross,他是 nogil 项目的作者。Python猫的老读者应该有印象,我们在 2021 年曾翻译过他与 Python 核心开发者们的一次研讨会的纪要,这份纪要里概括了 nogil 的主要设计思路,同时回答了核心开发者们最为关注的约 20 个问题。
经过一年多时间的沉淀,nogil 项目现在终于形成了正式的 PEP,这意味着它被采纳进 Python 主分支的可能性变大了一些啦!
PEP 的标题是《使 CPython 的 GIL 成为可选项》(Making the Global Interpreter Lock Optional in CPython),内容详实,正文超过 1 万字,这个体量的 PEP 绝对够得上排在所有 PEP 的前十了。
简单而言,这份提案提议给 CPython 增加一个构建时配置项--disable-gil
,作用是构建出一个线程安全的无 GIL 的解释器。