目录

Python 3.14 自由线程实战:无 GIL 的 Python 到底怎么用

GIL 终于不再是"标配"

如果你写过 Python 多线程,一定听过这句话:线程是并发的,但不是并行的。罪魁祸首就是 GIL(Global Interpreter Lock,全局解释器锁)——同一时刻只允许一个线程执行 Python 字节码,导致 CPU 密集型任务用多线程毫无加速,只能退而求其次用 multiprocessing 多进程。

这个局面从 Python 3.13(2024 年 10 月)开始松动:官方推出了自由线程(free-threaded)构建,即编译时不带 GIL 的 Python。3.13 里它还是"实验特性",而 3.14(2025 年 10 月)起,自由线程正式成为官方支持的构建选项(PEP 703 第二阶段,标准见 PEP 779),不再标记为实验。这意味着:无 GIL 的 Python 不再是玩具,可以认真评估上生产了。

第一步:装一个 free-threaded 版本

最简单的途径是用 uv,一条命令搞定(版本号带 t 后缀即 free-threaded):

1
2
3
4
5
# 安装 free-threaded 版 Python 3.14
uv python install 3.14t

# 查看已安装的解释器
uv python list

Windows/macOS 也可以从 python.org 官方安装包勾选 free-threaded 选项;Linux 上除了 uv,也可以源码编译:

1
2
./configure --disable-gil
make -j$(nproc)

第二步:验证 GIL 是否真的关了

1
2
3
4
import sys

# True = 带 GIL(默认构建);False = 自由线程模式
print(f"GIL enabled: {sys._is_gil_enabled()}")

运行 python3.14t script.py 输出 False,就说明你跑在自由线程模式下了。

第三步:实测——多线程终于能跑满 CPU

写一个纯 CPU 计算脚本(循环求斐波那契),对比 4 线程在两个解释器下的表现:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import sys
import threading
import time

def cpu_work(n: int) -> None:
    """纯 CPU 计算:迭代求第 n 个斐波那契数"""
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b

N = 300_000
N_THREADS = 4

start = time.perf_counter()
threads = [threading.Thread(target=cpu_work, args=(N,)) for _ in range(N_THREADS)]
for t in threads:
    t.start()
for t in threads:
    t.join()
print(f"GIL enabled: {sys._is_gil_enabled()} | 4 线程耗时: {time.perf_counter() - start:.2f}s")

典型结果(4 核机器):

解释器 4 线程耗时 说明
默认 3.14(带 GIL) ~3.6s 线程轮流持锁,等于串行
3.14t(free-threaded) ~1.0s 真正并行,接近线性加速

同样的代码、同样的 threading,只是换了个解释器,CPU 密集型任务就从"毫无加速"变成"接近线性加速"。这也是自由线程最直接的价值:IO 型任务用 asyncio,CPU 型任务终于可以用线程而不是进程,内存共享、启动开销都比多进程小得多。

第四步:检查第三方库是否兼容

自由线程最大的风险不在语言本身,而在 C 扩展。好在主流生态已经跟上:free-threaded 的 wheel 用带 t 的标签区分(如 cp314t-cp314t-linux_x86_64),pip 会自动选择正确的包。numpy、pandas、scikit-learn 等主流库均已发布 free-threaded wheel;完整支持矩阵可以看官方跟踪页面 py-free-threading.github.io/tracking

安装后可以快速自检:

1
2
# 在 3.14t 环境下安装并导入常用库,确认没有报错
uv pip install --python 3.14t numpy pandas

代价与坑:没有免费的午餐

  1. 单线程性能略降:自由线程版单线程基准大约慢 10%(macOS 约 3%),内存占用高 15-20%——这是无锁并发的固有成本。
  2. 全局状态不再安全:带 GIL 时模块级可变对象靠 GIL 隐式保护;无 GIL 后,listdict 的并发读写需要显式加锁,否则有竞态。
  3. JIT 与自由线程互斥:3.14 的实验性 JIT(PYTHON_JIT=1)不支持自由线程构建。
  4. 生态长尾:小众 C 扩展可能还没有 t 标签的 wheel,装之前先查支持矩阵。

结论:现在能用了吗?

能用,但要看场景。Phase II 意味着官方背书,3.14t 已适合在受控环境中跑 CPU 密集型服务(图像处理、数值计算、爬虫解析等)。如果你的项目主要依赖纯 Python 或主流科学计算库,迁移成本很低——换解释器 + 跑一遍测试即可。至于"无 GIL 成为默认"(Phase III),官方明确表态尚未决定,那还是未来时。不过对开发者来说,多一个能真正用上多核的 Python 选项,本身就是好消息。