GIL是CPython解释器的实现细节而非Python语言特性,它通过互斥锁确保同一时刻仅一个线程执行字节码,使CPU密集型任务无法真正并行,但I/O密集型任务仍可受益。
Python 的 GIL(Global Interpreter Lock,全局解释器锁)不是 Python 语言的特性,而是 CPython 解释器的实现细节。它是一把互斥锁,确保同一时刻只有一个线程执行 Python 字节码。这意味着:即使你开了多个线程,纯 CPU 密集型任务也无法真正并行提速;但 I/O 密集型任务仍能受益于多线程——因为等待 I/O 时会主动释放 GIL。
CPython 的内存管理不是线程安全的(例如引用计数机制)。加 GIL 是最简单、高效的方式避免多线程同时修改对象引用导致崩溃。去掉 GIL 理论上可行,但需重写大量底层逻辑,且可能降低单线程性能——这与 Python “简单、实用”的设计哲学相悖。
multiprocessing 模块启动多进程,绕过 GIL。写两个纯计算函数,分别用单线程和多线程运行,对比耗时:
import time import threadingdef cpu_bound(n): while n > 0: n -= 1
单线程:约 4 秒
start = time.time() cpu_bound(200_000_000) cpu_bound(200_000_000) print("Single thread:", time.time() - start)
多线程:仍约 4 秒(非显著缩短)
start = time.time() t1 = threading.Thread(target=cpu_bound, args=(200_000_000,)) t2 = threading.Thread(target=cpu_bound, args=(200_000_000,)) t1.start(); t2.start() t1.join(); t2.join() print("Two threads:", time.time() - start)
结果会明显显示:CPU 密集任务下,多线程并未加速——这是 GIL 在起作用。
立即学习“Python免费学习笔记(深入)”;
multiprocessing 启动子进程:每个进程有独立解释器和内存空间,天然避开 GIL。concurrent.futures.ProcessPoolExecutor 管理进程池,语法简洁、易维护。
展库(如 NumPy 数组运算、requests 库的底层 socket 操作)。