穿透 Python GIL 的迷雾:它到底锁的是什么?为什么 CPython 仍···
穿透 Python GIL 的迷雾:它到底锁的是什么?为什么 CPython 仍坚持多线程?
在我这些年教授 Python、参与高性能系统开发的经历中,最常被问到的问题之一就是:
“GIL 到底锁的是什么?是不是锁住了所有线程?”
“既然 GIL 会阻塞多线程并行,那 CPython 为什么还要保留多线程?”
“多线程在 Python 中还有意义吗?”
这些问题背后,是 Python 开发者对性能、并发和底层机制的深深困惑。GIL(Global Interpreter Lock,全局解释器锁)几乎是 Python 世界里最具争议的设计之一,它既是历史遗留,又是现实妥协;既是性能瓶颈,又是稳定基石。
这篇文章,我将带你从 Python 的发展背景讲起,逐步深入 GIL 的本质、触发机制、设计原因与工程实践价值,并结合大量代码示例与真实案例,帮助你真正理解:
一、开篇:Python 的发展与 GIL 的诞生
在 Python 的早期版本中,内存管理依赖引用计数(Reference Counting)。引用计数的更新不是原子操作,因此在多线程环境下会产生竞争条件(Race Condition)。
这就是 GIL 的起源。
二、GIL 到底锁的是什么?(核心问题)
✅ GIL 锁住的不是 Python 对象,而是整个解释器状态(Interpreter State)
只有持有 GIL 的线程才能执行 Python 字节码
其他线程即使被调度,也无法执行 Python 层面的运算
GIL 不锁 I/O,不锁 C 扩展,不锁系统调用
GIL 的本质:保护引用计数与对象模型
引用计数不是原子操作
内存分配器不是线程安全的
对象内部状态不是线程安全的
三、GIL 的工作机制:什么时候会释放?什么时候会阻塞?

1. I/O 操作时释放 GIL(最重要)
例如:

✅ 2. C 扩展主动释放 GIL

✅ 3. 线程切换时释放 GIL(每隔一定字节码执行次数)
四、为什么 CPython 仍然保留多线程?
✅ 1. 多线程对 I/O 密集型任务非常有效
网络请求
文件读写
数据库访问
爬虫
日志处理
✅ 2. 多线程比多进程更轻量
✅ 3. CPython 的生态大量依赖线程
五、GIL 的误区:你以为它限制了所有并行,其实没有
✅ 1. I/O 操作(会释放 GIL)
网络请求
文件读写
sleep
socket
subprocess
✅ 2. C 扩展(主动释放 GIL)
NumPy
Pandas
TensorFlow
PyTorch
Pillow
✅ 3. 多进程(完)

扫一扫,关注我们
