pep 703 并非移除 gil,而是使其可选:需编译自由线程版 python 并显式启用,gil 才在运行时禁用;默认安装仍带 gil,且当前仅实验性支持,生产环境尚不适用。

PEP 703 是什么,它真能“移除 GIL”吗?
不是移除,是“让 GIL 可选”。PEP 703 的核心目标是把 CPython 的全局解释器锁(GIL)从强制启用改为运行时可禁用——前提是 Python 解释器以“自由线程模式”(free-threaded build)编译,并且用户显式启用。它不改变默认行为,也不要求现有代码改写,但为真正并行的 CPU 密集型多线程铺了路。
- 默认安装的
python(比如通过 python.org 下载、apt install python3)仍是带 GIL 的构建,完全不受影响 - 自由线程构建目前仅在 CPython main 分支提供,需手动编译,且暂无稳定版二进制分发
- 启用后,
threading模块的行为不变,但多个线程能真正并发执行 Python 字节码(而非轮流切换)
怎么编译并验证一个自由线程的 Python?
只有从源码构建才能获得 PEP 703 支持,且必须开启 --without-pymalloc 和 --with-free-threading 配置选项(后者是关键开关)。
- 克隆最新 CPython main 分支:
git clone <a href="https://www.php.cn/link/d5fc93640233c90c41c729d8b185bd56">https://www.php.cn/link/d5fc93640233c90c41c729d8b185bd56</a> && cd cpython - 运行配置:
./configure --with-free-threading --without-pymalloc --prefix=$HOME/python-free - 编译安装:
make -j && make install - 验证是否生效:
$HOME/python-free/bin/python3 -c "import sys; print(sys._is_gil_enabled())"→ 输出False才表示 GIL 确实被禁用
注意:--without-pymalloc 是当前必要条件,因为 pymalloc 的内存分配器不是线程安全的;未来可能优化,但现阶段跳过它会编译失败或运行崩溃。
哪些代码能立刻受益,哪些反而更慢?
自由线程模式只对满足两个条件的场景有实际提升:纯 Python 的 CPU 密集型计算 + 显式使用 threading(而非 multiprocessing 或异步)。其他情况要么无变化,要么出问题。
立即学习“Python免费学习笔记(深入)”;
- ✅ 能受益:用
threading.Thread跑多个numpy计算(前提是 numpy 已链接 OpenMP 且释放 GIL)、自定义数值循环(for i in range(10*<em>7): total += i </em> i) - ❌ 不受益甚至退化:I/O 密集型(
requests.get、open())——GIL 本就常被释放,自由线程不带来额外收益;C 扩展未适配线程安全(如老版本lxml、某些数据库驱动),可能触发数据竞争或段错误 - ⚠️ 需检查:所有全局变量、模块级缓存、
<strong>dict</strong>修改都变成竞态点,threading.local()仍是安全的,但global counter = 0+ 多线程自增必须加threading.Lock
现在就上生产?先看看这三件事
PEP 703 还在演进中,main 分支的自由线程构建属于实验性功能,离生产就绪有明确距离。
- 第三方包兼容性极差:绝大多数 C 扩展(
psycopg2、pillow、cryptography)未声明线程安全,导入即可能 crash - 没有 wheel 支持:
pip install默认仍装 GIL 版本,你得自己为每个依赖编译自由线程版,或等作者发布abi3+free-threaded双标签轮子 - 调试难度陡增:
Segmentation fault更难复现,sys.settrace和部分 profiler 在自由线程下行为异常
真正值得关注的节点是:CPython 3.13 正式支持 --with-free-threading 配置,而首个标记为 “production-ready free-threaded build” 的官方二进制,预计最早出现在 3.14 或之后。在此之前,它更适合在隔离环境里跑基准测试,而不是替换线上 Python。
GIL 是否启用,现在还是个编译期决定,不是运行时开关;想靠 pip install 一键切换,还早。










