Python 3的GIL导致CPU密集型自动化脚本多线程反而更慢,因CPython强制字节码串行执行;I/O操作(如requests、sleep)可释放GIL,此时多线程有效;纯计算任务应改用multiprocessing,推荐ProcessPoolExecutor。

Python 3 的 GIL 会让 CPU 密集型自动化脚本变慢,不是因为你代码写得差,而是 CPython 解释器强制所有线程串行执行字节码——哪怕你开了 16 个线程、跑在 64 核服务器上,也只有一条线程真正在干活。
为什么 threading 在自动化脚本里反而更慢?
GIL 不是 bug,是 CPython 内存管理(尤其是引用计数)的必要保护机制。当你的自动化脚本做的是纯计算类任务(比如批量解析 JSON、计算哈希、图像缩放、正则匹配大量文本),每个线程都在疯狂争抢 GIL:
- 每次线程切换都要保存寄存器、刷新缓存、重新申请锁——全是开销,没有收益
- 实测常见场景:
sum(i**2 for i in range(10**7))开 4 个threading.Thread,总耗时比单线程多 10%–30% - 自动化脚本如果依赖
time.sleep()或requests.get(),那另当别论——这些 I/O 操作会主动释放 GIL,此时多线程仍有效
什么时候该果断换 multiprocessing?
判断标准非常具体,不是“感觉慢”,而是可测量:
- 用
time.perf_counter()测单次核心任务耗时 > 100ms - 任务之间无强共享状态(比如不需要实时读写同一个全局 dict 或 list)
- 你用的是 CPython(即常规 pip install 的 Python),不是 PyPy/Jython/CPython 3.13+ --nogil 模式
满足这三点,multiprocessing 就是唯一稳态解。每个子进程有独立解释器和独立 GIL,天然绕过限制。
concurrent.futures.ProcessPoolExecutor 是最省心的入口
比起裸写 Process 或 Pool,ProcessPoolExecutor 接口统一、异常传播友好、资源自动清理,适合绝大多数自动化脚本:
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
from concurrent.futures import ProcessPoolExecutor import math <p>def cpu_task(n):</p><h1>纯计算,无 I/O,无共享变量</h1><pre class="brush:php;toolbar:false;">return sum(math.sin(i) for i in range(n))
if name == "main": numbers = [10*6] 8 # 8 个相似耗时任务 with ProcessPoolExecutor(max_workers=4) as executor: results = list(executor.map(cpu_task, numbers))
注意点:
- 必须包在
if __name__ == "__main__":里,否则 Windows/macOS 上会递归启动新进程 -
max_workers通常设为os.cpu_count() - 1,留一个核给系统调度 - 传参和返回值会被序列化(pickle),避免传大型未序列化对象(如打开的文件句柄、数据库连接)
容易被忽略的破局细节
真正卡住人、导致“用了 multiprocessing 还是不快”的,往往不是模型选错,而是边界没理清:
- 任务拆分粒度太细:比如把 100 万个短计算拆成 100 万个
submit()调用,进程间通信开销反超计算收益 - 误传共享资源:把
logging.getLogger()或全局配置对象直接传进子进程,会触发 pickle 失败或行为异常 - 忘了 C 扩展其实也能破 GIL:像
numpy.dot()、cv2.cvtColor()这类底层用 C 实现的函数,内部会临时释放 GIL,纯 Python 循环外包给它们,有时比整个进程拆分更轻量
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










