跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Python 有望告别 GIL 锁:PEP-703 提案深度解析与影响评估

Python 全局解释器锁(GIL)长期限制了多核并行能力,尤其在 AI 领域。PEP-703 提案提出通过构建时配置 --disable-gil 移除 GIL,实现线程安全无锁解释器。该方案涉及引用计数、内存管理及容器线程安全等底层变更。虽然能解决多核利用问题,但会导致单线程性能下降及第三方库维护成本增加。相比香农计划的多子解释器方案,PEP-703 提供了另一种并行路径,两者设计细节存在共存可能,标志着 Python 多线程演进的重要转折点。

神经兮兮发布于 2025/2/6更新于 2026/10/2483 浏览
Python 有望告别 GIL 锁:PEP-703 提案深度解析与影响评估

Python 全局解释器锁(GIL)的现状与变革

在 Python 生态中,全局解释器锁(Global Interpreter Lock,简称 GIL)是一个长期存在且备受争议的设计。它的主要作用是防止多个本地线程同时执行 Python 字节码,这导致 CPython 解释器无法实现真正的多线程并行执行。需要明确的是,本文讨论的 Python 解释器特指 CPython。

GIL 的历史背景与局限性

这把锁在 Python 的早期发展中具有积极的作用。在单核 CPU 时代,GIL 简化了内存管理模型,使得引用计数等机制能够安全地运行,避免了复杂的锁竞争问题。然而,随着硬件架构向多核 CPU 演进,GIL 成为了阻碍 Python 在多核环境下进行并行编程的主要瓶颈。

GIL 影响的主要是 CPU 密集型任务,比如科学计算、数值计算以及大规模数据处理任务。在这些场景下,开发者往往被迫使用多进程(multiprocessing)来绕过 GIL,但这带来了进程间通信开销大、内存占用高等问题。

在最近发布的官方文档及相关技术综述中,概括了 GIL 对科学计算(主要是 AI/ML)造成的四类核心问题:

  1. 并行化表达困难:GIL 导致许多并行化操作难以直接表达,影响了强化学习、DeepMind 相关研究、医学治疗模拟及生物信息学研究等领域的效率。
  2. 库可用性受限:GIL 影响了 Python 核心科学计算库的可用性,例如 PyTorch、scikit-learn、NumPy 等在多线程环境下的性能释放受到限制。
  3. GPU 资源利用不足:GIL 导致无法充分利用 GPU 资源,特别是在计算机视觉任务中,CPU 端的数据预处理和调度成为瓶颈。
  4. 模型部署复杂:GIL 导致难以高效部署 Python AI 模型,特别是基于神经网络的 AI 模型在高并发服务场景下的吞吐量受限。

社区呼声与历史尝试

社区中想要移除 GIL 的呼声以及尝试,此起彼伏,绵绵不绝,但这个话题一直悬而未决。抱怨、质疑、不满、不甘、期盼等这些诸多的情绪,不是那么容易平息的。然而,从一个积重已久的庞大的项目中移除一个根基性的设计,又谈何容易?

2023 新年刚过,这个话题又一次热了起来,又一轮对 GIL 的挑战开始了。这一次,事情似乎有了新的转机,这次也许能成功了呢?

PEP-703 提案详解

PEP-703 在今年 1 月 9 日新鲜出炉,虽然它目前仍是'草案'状态未被采纳,但是这份 PEP 的意义十分重大!这个 PEP 的作者是 Sam Gross,他是 nogil 项目的作者。经过一年多时间的沉淀,nogil 项目现在终于形成了正式的 PEP,这意味着它被采纳进 Python 主分支的可能性变大了一些。

PEP 的标题是《使 CPython 的 GIL 成为可选项》(Making the Global Interpreter Lock Optional in CPython),内容详实,正文超过 1 万字,这个体量的 PEP 绝对够得上排在所有 PEP 的前十了。

简单而言,这份提案提议给 CPython 增加一个构建时配置项 --disable-gil,作用是构建出一个线程安全的无 GIL 的解释器。为了实现无 GIL 的解释器,Python 底层的部分设计必须作出变更,内容可以概括成四类:

  • 引用计数:需要确保引用计数的原子性,避免多线程竞争导致的内存泄漏或双重释放。
  • 内存管理:分配器和垃圾回收机制需要适应无锁环境,可能需要引入更细粒度的内存池。
  • 容器线程安全:字典、列表等内置容器的内部结构需要支持并发访问,或者提供相应的保护机制。
  • 锁和原子 API:底层需要暴露更多的原子操作接口,供上层数据结构使用。

潜在挑战与解决方案

如果这份 PEP 被采纳实现的话,它会带来一个不容忽视的问题:Python 将发布两个不同版本的解释器,而第三方库也要相应地开发/维护/发布两个版本的软件包。这可能导致 ABI 不兼容,破坏现有的二进制分发体系。

PEP-703 的作者也考虑到了这个问题,他提出的解决方案是与 Anaconda 一起发布无 GIL 的 Python,同时在 conda 里集中发布管理那些兼容了新 Python 的库。考虑到 Anaconda 在科学计算与数值计算领域的强大影响力,此举既能较好地发挥 nogil Python 的用处,又能减少用户及三方库开发者面对两种发行版时的割裂感。

值得注意的是,nogil 的 Python 还有一个更大的问题,那就是会影响单线程程序的性能。基于 Python 3.11 版本,实现了有偏见的引用计数及永生对象后,Python 单线程性能会变慢 10%。尽管这个数值在最新的 nogil 原型版本上可以降低到 5%,但是,另外至少还有两项难以规避的性能下降点:

  • 2% - 全局的自由列表(主要是元组和浮点数自由列表)带来的额外开销。
  • 1.5% - 集合中每个对象的互斥锁(字典、列表、队列)带来的锁竞争开销。

单线程的代码才是最广泛的使用场景,可以说这会影响到每一个 Python 用户。任何试图移除 GIL 的项目都不可避免要面临这项挑战。开发者需要在单线程性能和多线程扩展性之间做出权衡。

与其他方案的对比

尽管存在着以上的两大问题,但 PEP-703 还是很有可取之处的。

与 Gilectomy 的对比

相比于 2015 年提出的著名的 Gilectomy 项目(由 GIL ectomy 两个单词组合而成,ectomy 是一个医学上的术语'切除术'),nogil 在单线程的性能上要快得多,同时可扩展性也更好。Gilectomy 曾尝试彻底移除 GIL,但未能解决单线程性能回退的问题。

与香农计划(Shannon Plan)的对比

相比于 2021 年火热的'香农计划'的作者 Eric Snow 提出的 PEP-684 方案(给每个子解释器创建 GIL),后者一方面需要实现作为前提的多个 PEP(如 PEP-554、PEP-683),另一方面需要用户处理多子解释器间共享变量的麻烦。

在香农计划的规划中,PEP-554 与 PEP-684 已经囊括在内了,版本目标是充分利用 Python 的子解释器,让子解释器使用各自的 GIL,从而实现多线程的并行。这种方案被称为'多解释器多 GIL'。

好消息是,3.12 的计划跟本文的主角 PEP-703 并不冲突。事实上,它们的很多设计细节是一致的,也就是说,这两套对于 GIL 的改造方案是可以共存的,它们相互促进,事半功倍!

香农计划有 Python 之父 Guido van Rossum 站台,还有财大气粗的微软支持着一支豪华的团队投入开发(含 Guido 和 Eric Snow),因此,多解释器多 GIL 的方案很可能会更快落地。而 PEP-703 有 PSF 首位全职开发者 Łukasz Langa 的倾力支持,社区的反响也不错,我觉得它今后落地的希望也挺大!

总结与展望

无论如何,这次香农计划和 PEP-703 掀起的对 GIL 的挑战,比以往所有的尝试都更猛烈,更有成功的可能,让人不由得心生欢欣之喜。但愿它们实现的一天不会太远吧。

对于广大 Python 开发者而言,关注这一进程至关重要。未来可能面临的编译选项、库的二进制兼容性变化,都需要提前做好准备。随着硬件算力的不断提升,Python 能否真正突破 GIL 的限制,将直接影响其在高性能计算和人工智能领域的竞争力。

目录

  1. Python 全局解释器锁(GIL)的现状与变革
  2. GIL 的历史背景与局限性
  3. 社区呼声与历史尝试
  4. PEP-703 提案详解
  5. 潜在挑战与解决方案
  6. 与其他方案的对比
  7. 与 Gilectomy 的对比
  8. 与香农计划(Shannon Plan)的对比
  9. 总结与展望

更多推荐文章

查看全部
  • DeerFlow 2.0:字节开源的超级 Agent 框架
  • 基于 AIStarter 一键安装 ComfyUI 黎黎原上咩 7.0 整合包
  • Java 算法基础实战:输入输出与格式化控制详解
  • EnvPilot:基于 Rust 的跨平台环境变量管理工具
  • 飞算 JavaAI 代码审查落地实践与关键细节
  • DeepSeek 使用指南:提示词技巧与本地知识库搭建
  • C++ 异常处理:理论、栈展开与最佳实践
  • 大厂面试流程解析与核心技术考点汇总
  • OpenClaw 接入自定义模型及 WebUI 智能操作实战
  • 前后端共用校验规则方案:后端为最终权威
  • Ubuntu 20.04 手动安装与配置 Ollama 本地服务
  • Llama3 快速体验:Groq 平台 4 种接入方案与性能分析
  • Xcode 7 中手动链接 .dylib 库的两种方案
  • Go Channel 深入解析:状态、底层原理与工程实践
  • Spring AI 实现多模型共存:基于 OpenAI 协议调用 ChatGPT 与千问
  • LLM 模型微调:PEFT 与 QLoRA 技术总结
  • 逻辑回归算法详解:原理、代码与可视化
  • Shannon:利用 AI 自动挖掘 Web 应用真实漏洞
  • 十五五规划下 Java 程序员的职业机遇与行业新赛道
  • 无需复杂数学:轻松理解大模型基本原理

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online