为什么Python多线程在CPU密集型脚本中变慢_理解GIL锁与多进程的权衡
Python多线程在CPU密集型任务中因GIL锁导致线程排队执行,实际串行且切换开销使耗时增加10%-30%。多进程虽能并行,但需序列化传递数据,适合计算量大、参数小的任务。通过NumPy、C扩展等绕过解释器可绕开GIL限制。
Python多线程在CPU密集型任务中变慢,这不是写错了代码,而是CPython解释器在背后强制你“排队计算”——GIL让所有线程抢同一把锁,谁拿到谁算,其余只能干等着。这不是bug,而是设计上做的取舍。

原因其实很实在:线程启动、切换、争抢GIL本身就要消耗CPU时间片。而纯计算任务又不触发GIL释放——它不像requests.get()或open()那样会主动让出锁——结果多个线程在单核上反复做上下文切换,实际执行仍然是串行的。
为什么threading跑计算任务反而更耗时?
- 每100个Python字节码指令后,
GIL才有可能轮转一次,但轮转开销远大于收益 - 两个线程做同样总量的计算,耗时通常比单线程多出10%–30%。实测在
fibonacci()、sum([i**2 for i in range(10**7)])这类场景中经常出现 - 哪怕用
concurrent.futures.ThreadPoolExecutor包装再多层,也绕不开这个底层限制
multiprocessing真能解决问题吗?
能,但代价很明确:进程间不共享内存,每次传参或取结果都要走pickle序列化,数据越大越拖慢速度;启动新进程本身也有毫秒级开销。
- 适合单次计算量大、参数和返回值都很小的任务(比如对10万行数据做独立数值变换)
- 避免频繁创建
Process——用Pool或ProcessPoolExecutor复用进程会更划算 - 注意在Windows下子进程会重新导入模块,必须加上
if __name__ == '__main__':,否则会报RuntimeError: An attempt has been made to start a new process
比multiprocessing更轻量的替代方案有哪些?
不是所有计算都值得上多进程。先看看能不能“不动线程模型,只换执行体”:
NumPy/SciPy数组运算:底层由C/Fortran实现,会自动释放GIL,单线程就能吃满多核concurrent.futures.ProcessPoolExecutor+functools.partial:比裸multiprocessing更容易管理,支持超时和回调- Cython或
ctypes封装C函数:在C代码段手动调用PyThreadState_Release和PyThreadState_Swap释放GIL,适合已知的热点函数
真正容易被忽略的点:GIL不是“锁住整个程序”,而是“锁住Python字节码执行”。只要计算逻辑能下沉到不经过解释器的层面(比如向量化、C扩展、甚至subprocess.run(['rust-code'])),就自然绕开了它——优化方向不在于“怎么开更多线程”,而在于“让哪部分代码彻底不走Python解释路径”。
WPS Office是一款面向macOS用户的综合办公套件,将文字处理、电子表格、演示文稿、PDF工具、模板与云协作整合在同一应用中。它兼容常见Microsoft Office格式,支持Intel及Apple芯片Mac,基础功能可免费使用,
Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。
REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。
Adobe Photoshop 是面向摄影师、设计师和内容创作者的专业图像处理工具,可在 Windows 上完成照片修饰、选区抠图、图层合成、文字排版、绘画及生成式编辑。软件采用订阅授权,由 Creative Cloud 管理安装、更新与许
Adobe InDesign 是面向印刷与数字出版的专业页面排版工具,可制作书籍、杂志、宣传册、海报、交互式 PDF 和电子书。它提供精细的文字样式、多页面管理、印前检查及多格式输出能力,并能与 Photoshop、Illustrator
Adobe Illustrator 是用于绘制矢量图形、插画、图标、徽标和版式的专业设计工具。它以路径和锚点为核心,作品放大后仍能保持清晰,并提供画板、文字、渐变、图像描摹及精确变换等功能,适合品牌视觉、印刷物料、数字界面和商业插画创作。













