bigywater.tech
Python · 4

multiprocessing:Python 如何绕过 GIL 使用多核

用同一个CPU密集任务对比单线程、2线程、2进程三种跑法的耗时,验证GIL是怎么锁住线程并行、又是怎么锁不住多进程的。

0倍提速
2线程并发CPU密集任务的加速比
≈2倍提速
2进程并发的加速比
独立GIL
每个进程拥有自己独立的解释器和锁

做的事:同一个CPU密集任务,三种跑法

一个纯计算函数(循环3000万次累加平方),分别用单线程串行、2线程并发、2进程并发跑两遍。

代码def cpu_bound(n): x = 0 for i in range(n): x += i * i return x N = 30_000_000 # 单线程串行跑2遍 / 2个threading.Thread并发跑 / 2个multiprocessing.Process并发跑

验证:2个线程并发,耗时跟单线程没区别

本机10核CPU,理论上2个线程应该能提速接近2倍。

结果单线程串行跑2遍: 耗时 2.3180s 2个线程并发跑(threading): 耗时 2.3669s ← 跟单线程几乎一样,甚至略慢! 2个进程并发跑(multiprocessing): 耗时 1.1651s ← 提速约2倍 本机CPU核心数: 10

结果很直接:2个线程"并发"执行CPU密集计算,耗时(2.3669s)跟单线程串行(2.3180s)几乎一样,完全没有利用上多核——这就是GIL(全局解释器锁)的效果:同一时刻,只允许一个线程执行Python字节码,哪怕你开了10个线程、本机有10个核心,纯计算型代码也只能有一个线程在跑,其它线程都在等这把锁。

换成2个独立的进程,耗时降到1.1651s,接近理论上的2倍提速——因为每个进程都有自己独立的Python解释器和GIL,互不干扰,能同时用上2个CPU核心。

这就是"绕过GIL"的含义:GIL锁的是同一个进程内的多个线程,多进程天生就是不同进程,每个进程有自己独立的GIL,锁不到别的进程头上——multiprocessing是靠"另起一个完整的Python解释器",而不是靠"打破GIL"来实现多核并行的。

分步演示:GIL是怎么锁住线程、又是怎么锁不住进程的

每一步都是本文上面在10核CPU上跑出来的原始耗时。

同样的CPU密集任务,线程提不了速,进程能
这一步新验证的跑法

    本文用到的工具

    • 本机 Python 3.14.7,10核CPU
    • threading.Thread vs multiprocessing.Process:对比CPU密集任务的加速效果
    京ICP备2026067502号-1京公网安备11010502063487号