用八个线程并行计算哈希,监控里进程 CPU 始终在一百上下,八核机器空着七个,总耗时和单线程几乎一样。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,CPython 同一时刻只允许一个线程执行字节码,计算型任务拿不到并行度,线程切换反而多出开销,GIL 只在 IO 等待时释放,加线程没有收益。

「GIL 全局锁限制」这类改动最怕改一半,回滚脚本先准备好,再动生产。报错里带路径的,先去看那个路径在不在、权限对不对。

from concurrent.futures import ProcessPoolExecutor
with ProcessPoolExecutor(max_workers=8) as ex:
    print(sum(ex.map(hash_chunk, chunks)))

同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

具体做法是,计算密集型任务改用多进程,从根上绕开 GIL 的限制,别再堆线程;数据量大时用进程池分片,结果再按片回传合并;IO 等待占比高的场景再回到多线程,别用进程池硬扛。

最后用这个标准收尾,CPU 使用率上到七核以上,总耗时能降到单线程的六分之一左右。

作者 9823189