告别“一核有难,多核围观”!Python 3.14 已实验性关掉 GIL

122 阅读3分钟

Python 是全球最受欢迎的编程语言之一,以简洁易用和强大生态闻名。但长期以来,全局解释器锁(Global Interpreter Lock,简称 GIL) 是 CPython(Python 标准实现)中一个备受争议的机制,它严重限制了多线程在 CPU 密集型任务中的并行性能。

GIL 是什么?为什么存在?

GIL 是 CPython 中的一个互斥锁,确保任意时刻只有一个线程能执行 Python 字节码

  • 存在原因

    • Python 的内存管理主要靠引用计数(reference counting)来实现垃圾回收。
    • 多线程同时修改引用计数可能导致内存泄漏或崩溃。
    • 在 Python 早期(1990 年代),多核 CPU 不普及,GIL 是一种简单方案:简化线程安全,让 C 扩展模块开发更容易(无需手动处理并发)。
  • 优点

    • 单线程性能优秀。
    • 内存管理简单可靠。
    • C 扩展兼容性好。
  • 缺点

    • 在多线程程序中,即使有多个 CPU 核心,CPU 密集型任务也无法真正并行(线程轮流持有 GIL)。
    • I/O 密集型任务(如网络、文件操作)不受大影响,因为 GIL 会定期释放。
    • 开发者常被迫用 multiprocessing(多进程)绕过 GIL,但这增加内存开销和数据共享复杂度。

多年来,社区多次尝试移除 GIL(如 Gilectomy 项目),但因性能下降、兼容性问题而失败。

最新进展:GIL 变得“可选”

截至 2025 年 12 月,Python 最新稳定版本是 Python 3.14.2(2025 年 12 月 5 日发布)。

  • Python 3.13(2024 年 10 月发布):首次引入实验性 free-threaded(自由线程,也称 no-GIL)构建

    • 通过编译时 --disable-gil 选项禁用 GIL。
    • 单线程性能有约 40% 开销,多线程 CPU 任务可显著加速。
  • Python 3.14(2025 年 10 月发布):重大进步!

    • free-threaded 模式正式支持,不再实验性(基于 PEP 779)。
    • 官方 Windows/macOS 安装程序支持可选安装 free-threaded 版本(通常命名为 python3.14t)。
    • 单线程开销大幅降低(约 5-15%),许多优化落地(如重新启用专化解释器)。
    • 主流库(如 NumPy、Pandas)兼容性大幅提升。
    • 默认构建仍带 GIL,以保证兼容性和稳定性。
    • 若加载不支持 free-threaded 的 C 扩展,GIL 会自动启用并警告。

关键点:GIL 没有在标准 Python 中被移除,而是提供了可选的“无 GIL”构建版本。这是一个渐进式变革(PEP 703),允许开发者选择真正多线程并行的解释器。

无 GIL 模式的好处与挑战

好处

  • CPU 密集型多线程任务可接近线性扩展(例如 8 核机器上接近 8 倍加速)。
  • 适用于数据科学、AI 训练、科学计算、高性能后端等场景。
  • 简化并发:无需多进程的复杂性。

挑战

  • 单线程仍有轻微性能开销。
  • 代码需更注意线程安全(以前依赖 GIL 隐式保护的代码可能出现竞态条件)。
  • 部分旧 C 扩展需重新编译支持(2025 年底主流库已基本适配)。
  • I/O 密集任务仍推荐标准版。

如何使用无 GIL Python?

  • Windows/macOS:从 python.org 下载 Python 3.14 安装器,选择 free-threaded 选项(可得 python3.14t.exe)。
  • Linux:通常需自行编译,或用工具如 uv 管理。
  • 检查是否无 GIL:
    import sys
    print(sys.version)  # 包含 "free-threading build"
    print(sys._is_gil_enabled())  # False 表示禁用
    

未来展望

Python 指导委员会采用三阶段计划:

  • 阶段一(3.13):实验支持。
  • 阶段二(3.14):正式可选支持。
  • 阶段三(未来,可能 3.15+):若生态完全准备好,可考虑默认无 GIL。

这让 Python 在多核时代更具竞争力,同时最大限度保留兼容性。如果你从事高性能计算,强烈推荐试用 Python 3.14 的 free-threaded 版本,体验真正的多线程并行!🐍