Python 正在逐步移除 GIL,这对 Python 开发者意味着什么

是时候在本地环境中尝试无 GIL 的 Python 了

Python 的全局解释器锁(GIL)是一个典型的“爱恨交织”的案例。

虽然它简化了语言设计,使 Python 能够快速发展并保持稳定,但它也成为了多线程程序利用多核 CPU 时的瓶颈。

这是软件工程师,尤其是来自其他编程语言的工程师,会说“Python很慢!”的主要原因。

幸运的是,Python社区发生了一项突破性变革。根据PEP 703提案,Python将在未来几年逐步移除GIL。

本文将带您快速回顾GIL的过去、现在和未来。更重要的是,本文还提供了一个适合初学者的指南,介绍如何在本地环境中安装并尝试无GIL的Python。

快速了解:什么是GIL?

元素周期表在设置无GIL的Python之前,让我们先快速了解一下这个臭名昭著的GIL。它到底是什么?

简而言之,GIL是一个互斥锁,确保每次只有一个线程执行Python字节码。

它于20世纪90年代初引入,提供了线程安全性和简单性。当时,单核CPU是标准配置……

但现在是2025年,哪里还能买到单核CPU?

为什么GIL成为问题?

每一个选择,无论好坏,都会带来后果。

由于 GIL 这一大胆的语言设计选择,Python 线程无法真正实现并行运行,导致 CPU 密集型多线程程序不适合用 Python 编写。

由于这一限制,开发者转而采用替代方案,如多进程,通过创建独立进程利用多个CPU核心,以及外部库如NumPy或Cython,将计算密集型任务卸载到编译后的C扩展中。

尽管这些变通方案有效绕过了线程限制,但它们引入了额外的复杂性、开销和资源消耗。

所有这些都促使 Python 社区持续呼吁彻底移除 GIL。

然而,正如 Python 的创始人 Guido van Rossum 在他的文章中写道,移除 GIL 并不容易。他欢迎移除 GIL,只要它不会损害单线程性能或向后兼容性,但这些都是难以满足的限制。

因此,Python 从未真正制定过一个切实可行的计划来移除 GIL,直到 PEP 703 解决方案出现。

PEP 703:一个没有 GIL 的崭新世界

这里是 PEP 703,由 Sam Gross 提出的解决方案,旨在使 GIL 成为可选项。

如其描述,该提案并未立即消除 GIL,而是引入了一个编译时选项(--disable-gil),这是一个新的构建配置标志,用于实验无 GIL 的 Python。

Sam Gross 的创新方法解决了之前的障碍:

  • 偏置引用计数:通过使用线程局部计数器来减少开销。
  • 不朽对象:频繁使用的不可变对象(如整数和单例)不会改变引用计数,从而消除不必要的锁定。
  • 线程安全内存管理:利用现代分配器(如mimalloc)高效处理并发内存操作。

Python 理事会已采纳 PEP 703,计划分阶段引入该功能

  • Python 3.13(已于 2024 年发布):提供可选的无 GIL 构建版本用于测试和社区反馈(通过构建时标志 --disable-gil 控制)。
  • 过渡阶段(约2026–2027年):统一构建,启用运行时切换GIL的功能。
  • 未来目标(约2028年后):无GIL Python成为默认设置,完全释放多核并行处理能力。

如何配置无GIL Python

光说不练假把式,让我们看看如何在本地环境中真正禁用GIL。

我使用的是 MacOS 15.5 版本进行此设置,其他操作系统应能获得类似结果,但操作步骤可能略有不同。

首先,从其 官方网站 下载最新 Python 3.13 安装程序(根据您的操作系统选择合适版本):

图0:Python 正在逐步移除 GIL,这对 Python 开发者意味着什么
从官方网站下载 Python 3.13 安装程序

打开安装程序后,我们可以查看关于 GIL 的相关信息:

图1:Python 正在逐步移除 GIL,这对 Python 开发者意味着什么
Python 3.13 installer interface

在“安装类型”步骤中,我们需要勾选“自由线程 Python [实验性]”选项(默认未勾选),然后进行安装:

图2:Python 正在逐步移除 GIL,这对 Python 开发者意味着什么

安装完成后,需执行位于/Applications/Python 3.13/路径下的“Install Certificates.command”文件,以使用新下载的Python并安装其所需的SSL根证书:

图3:Python 正在逐步移除 GIL,这对 Python 开发者意味着什么
Install SSL certifications

现在,整个安装过程已经完成。系统上安装了两个 Python 3.13 应用程序:Python 3.13 和 Python 3.13t。后者是实验性的无 GIL Python。

使用它非常简单,只需在终端中输入 python3.13t 即可。

现在,让我们打开两个终端窗口,并在两个不同的 Python 3.13 版本下运行 sysconfig.get_config_var(“Py_GIL_DISABLED”)

图4:Python 正在逐步移除 GIL,这对 Python 开发者意味着什么
终端中标准 Python 与无 GIL Python 的比较

欢迎来到无 GIL 世界!

为了感受其性能,让我们编写一个简单的测试脚本,看看无 GIL Python 是否真的能让多线程运行得更快:

import threading
import time

def cpu_bound_task(n, thread_id):
    count = 0
    for i in range(n):
        count += i*i

N = 100000000

def run_with_threads():
    threads = []
    start = time.time()    
    # Create and start 4 threads
    for i in range(4):
        t = threading.Thread(target=cpu_bound_task, args=(N, i))
        threads.append(t)
        t.start()
    
    # Wait for all threads to complete
    for t in threads:
        t.join()
    
    end = time.time()
    print(f'Total time taken: {end - start:.2f} seconds')

if __name__ == '__main__':
    run_with_threads()

上述程序创建 4 个线程,每个线程将执行相同的 CPU 密集型任务。让我们先通过标准的 Python 3.13 运行它:

图5:Python 正在逐步移除 GIL,这对 Python 开发者意味着什么
使用标准 Python 3.13 运行测试程序的结果

13.51 秒。这不够快,对吧?

现在是时候尝试 Python 3.13t,即无 GIL 的 Python:

图6:Python 正在逐步移除 GIL,这对 Python 开发者意味着什么
使用无 GIL Python 3.13 运行测试程序的结果

3.74 秒!

数据已经说明了一切——无GIL,真正的多线程。

此示例的视频版本在此:

https://youtu.be/0GjECtTDGyI

无GIL Python的社区反馈

没有编程语言是孤岛。

这一大胆举措的成功取决于整个Python社区。

目前看来,未来一片光明。

一方面,许多软件工程师,尤其是来自数据科学和人工智能社区的工程师,热切期待性能提升。

另一方面,包括Meta在内的主要科技公司已投入大量资源支持这一转型。

这对 Python 开发者意味着什么

GIL 还是无 GIL,这是个问题。

在可预见的未来,这将不再是个问题。

然而,鉴于无 GIL Python 预计将于 2028 年左右成为默认版本,而当前的无 GIL Python 3.13 仅为实验性构建,我们目前不应在生产环境中使用无 GIL Python

因为仍存在许多不确定性——包括兼容性、稳定性和生态系统采用率。它需要时间来完善。

但我们确实应该密切关注无GIL Python的发展。它已经发生了,而且非常令人兴奋!

人生苦短,现在你又多了一个选择Python的理由。

感谢阅读!保持关注,享受编程!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注