为什么Python的多线程总是跑不满CPU?

简介: 本文揭秘Python性能瓶颈——GIL(全局解释器锁):为何CPU密集型任务多线程反而更慢?详解GIL原理、影响场景(I/O密集型有效,CPU密集型受限),并提供三种绕过方案(多进程/multiprocessing、C扩展如NumPy、asyncio),附实测对比与Python 3.13+无GIL进展。

免费编程软件「python+pycharm」

链接:https://pan.quark.cn/s/48a86be2fdc0

一个让我怀疑人生的性能测试

两年前,我接了一个任务:优化一个数据处理程序。现有代码是单线程跑的,处理200万条数据要花12秒。我想着服务器是8核的,开8个线程并行处理,理论上1.5秒就能跑完。

我信心满满地改了代码:

import threading
import time

def cpu_task(n):
   """纯计算任务:累加"""
   total = 0
   for i in range(n):
       total += i
   return total

# 单线程
start = time.time()
for _ in range(4):
   cpu_task(50_000_000)
print(f"单线程: {time.time() - start:.2f}秒")

# 4个线程并行
threads = []
start = time.time()
for _ in range(4):
   t = threading.Thread(target=cpu_task, args=(50_000_000,))
   threads.append(t)
   t.start()
for t in threads:
   t.join()
print(f"4线程: {time.time() - start:.2f}秒")

跑完一看结果:

单线程: 10.21秒
4线程: 12.58秒

多线程反而更慢了? 我盯着屏幕看了五分钟,不敢相信自己的眼睛。

后来我才知道,这不是Python的bug,这是Python最著名的"特性"——GIL(全局解释器锁)

代理 IP 使用小技巧 让你的数据抓取效率翻倍 (35).png


GIL是什么?为什么会有这个东西?

GIL的全称是Global Interpreter Lock,是CPython(也就是我们平时用的那个Python解释器)里的一个互斥锁

它的作用很直接:同一时刻,只有一个线程能执行Python字节码

你可以把它想象成一把"令牌"——哪个线程拿到令牌,才能执行代码。执行一会儿(比如运行15毫秒,或者执行一定数量的字节码指令),就把令牌放下,让其他线程去抢。

为什么要有GIL?

原因很简单:Python的内存管理用的是引用计数——每个对象都记录着被引用的次数。如果两个线程同时修改同一个对象的引用计数,没有加锁保护,计数就可能出错,导致程序崩溃。

为了简化内存管理的复杂度,Python设计者决定用一把全局锁来保护一切。这个决定让Python在单核时代运行得很好,但到了多核时代,问题就暴露了。


多核CPU上,GIL是怎么"坑"你的?

在单核CPU上,GIL其实没什么问题——反正同一时间只有一个核心在工作。但到了多核时代,问题就来了。

想象一下:你有8个CPU核心,开了8个Python线程做计算。GIL只允许一个线程执行Python字节码,其他7个核心只能干瞪眼等着。

更糟糕的是线程切换的开销

当线程A执行了一段时间,主动释放GIL,准备让线程B上场。但注意,在线程B被操作系统唤醒并拿到GIL之前,线程A可能已经把GIL又抢回去了——因为线程A还在就绪状态,离CPU更近。

这就导致了一个尴尬的局面:多个核心忙来忙去,大部分时间都在"抢锁"和"等锁",真正干活的时间没增加多少

实验结果也证明了这一点。有研究者用RSA加密算法做测试,在6核机器上跑:1个线程耗时1.98秒,6个线程耗时居然也是2.1秒左右,几乎没有任何提升。


什么样的任务不会被GIL影响?

I/O密集型任务

如果你的程序大部分时间在等待网络响应、读写文件、查询数据库,这些操作会主动释放GIL,其他线程就能趁机执行。

所以,对于Web服务器、爬虫、文件处理这类任务,Python多线程是有效果的。

CPU密集型任务——比如循环累加、数学计算、数据处理——GIL就成了瓶颈。这类任务才是"多线程跑不满CPU"的元凶。

有一个例外:如果底层用的是C扩展库(比如NumPy),这些库在执行计算时会主动释放GIL,所以多线程依然能加速。


怎么办?绕过GIL的三种方案

方案1:多进程(multiprocessing)

既然GIL只锁线程,那就用进程。

每个进程有自己独立的Python解释器和GIL,多个进程可以真正并行地跑在不同的CPU核心上。

from multiprocessing import Pool

def cpu_task(n):
   total = 0
   for i in range(n):
       total += i
   return total

with Pool(4) as pool:
   results = pool.map(cpu_task, [50_000_000] * 4)

实际测试中,多进程在4核机器上能达到接近3.7倍的加速比。

代价:每个进程有独立的内存空间,数据共享需要序列化和进程间通信(IPC),内存占用会显著增加。

方案2:用C扩展库

如果你用的是NumPy这类底层用C/C++写的库,它们执行时会释放GIL,可以充分利用多核。

这也是为什么数据科学领域用Python做计算依然很快——因为真正吃计算的部分是C写的。

方案3:asyncio异步编程

对于I/O密集型任务,asyncio可以在单线程内实现高并发,效率比多线程更高,而且没有GIL的烦恼。


好消息:Python正在移除GIL

Python 3.13已经提供了实验性的无GIL版本(free-threaded build)。在Python 3.14中,这个特性进一步完善。

测试表明,对于可并行且数据独立的工作负载,无GIL版本能把执行时间缩短到原来的1/4,能耗也显著降低。

但要注意代价:

  • 单线程性能会下降约5-10%
  • 内存占用会增加约10%(引入了更细粒度的锁机制)
  • 第三方库的兼容性还在逐步完善中

记住这个结论

  • I/O密集型任务 → 放心用threading,多线程能提速
  • CPU密集型任务 → 用multiprocessing或C扩展,纯Python多线程不仅不加速,可能还更慢
  • 原因就是GIL——CPython解释器的全局锁,让多线程无法真正并行

那个让我怀疑人生的性能测试,后来用multiprocessing改写了。4个进程并行,耗时从10秒降到了2.8秒。核心原因就是绕开了GIL。

理解了GIL,你就能在Python的并发编程里少走很多弯路。下次有人问你"为什么Python多线程跑不满CPU",你就知道答案了——不是线程不够多,是GIL在中间当"交警",只允许一辆车通过。

目录
相关文章
|
3月前
|
网络协议 安全 Unix
Windows安装Wireshark抓包工具图文零门槛上手(2026最新)
Wireshark 是一款免费开源的跨平台网络协议分析工具,可实时捕获并解析数千种协议(如HTTP、DNS、TLS等)的数据包。它提供图形界面、强大过滤功能与深度协议解码能力,支持Windows/macOS/Linux/UNIX,是网络排障、安全分析和协议学习的行业标准工具。(239字)
|
17天前
|
C++ Python
Python的装饰器把我坑惨了,原来加不加括号完全是两码事
本文深入剖析Python装饰器中“加括号”与“不加括号”的本质区别:前者是调用装饰器工厂返回真正装饰器,后者是直接将函数本身作为装饰器。通过真实踩坑案例、执行时序实验和三大典型场景,清晰揭示语法背后的执行逻辑,助你彻底避开参数传递陷阱。(239字)
49 0
|
3月前
|
数据采集 边缘计算 安全
边缘计算与云端协同:老旧注塑机如何通过VBOX实现全量数据上云?
本文介绍智象九维VBOX注塑机边缘网关,首创非侵入式旁路部署技术,无需停机破线,安全监听RS-485/CAN等总线;内置2000+协议解析引擎,支持海天、弘讯等多品牌老旧设备;结合云边协同架构,实现高频数据滤波、特征提取、断点续传,并无缝对接阿里云IoT平台与TSDB,构建高可靠工业数据底座。(239字)
502 8
|
2月前
|
人工智能 前端开发 API
开源「仓颉.Skill」2.0,你现在可以蒸馏任何视频!
感谢大家支持,仓颉.skill(cangjie-skill)1.3K Star了!
1059 3
|
2月前
|
缓存 开发框架 Java
阿里云千问大模型Qwen3.7-Max功能、试用、计费、配置说明
阿里云Qwen3.7-Max是通义千问系列的纯文本旗舰大模型,专为智能体工作流、复杂推理与高强度编程场景设计,具备百万级上下文、深度思考与长周期自主执行能力,同时提供个人免费、新用户试用、按量计费与团队订阅等多元方案,适配个人、团队与企业全场景需求。
1176 0
|
2月前
|
人工智能 自然语言处理 运维
基于阿里云云联络中心:智能云客服与普通在线客服架构深度对比,附 RAG/NLU 完整代码实战与落地踩坑优化方案
多数企业分不清传统在线客服规则引擎与阿里云云联络中心 LLM+RAG 智能架构,盲目上线智能客服后投诉上涨、服务效率反向下滑。本文从底层架构、代码实战、落地场景多维度拆解两类系统差异,附 4 段可直接运行的 Python 代码,复盘 8 大高频踩坑点,输出标准化灰度上线与知识库迭代方案,助力技术人员完成客服系统选型与二次开发。
257 1
|
2月前
|
人工智能 JSON 自然语言处理
阿里云百炼工作流搭建中小学教材生成系统完整实操教程
依托阿里云百炼可视化工作流编排能力,无需深度代码开发,即可搭建标准化教学内容生成引擎。教师仅输入教材名称与适配学段,系统自动完成目录规划、章节正文撰写,产出贴合义务教育课程标准的完整教学材料,大幅压缩备课周期,缓解基层教师内容创作压力,助力区域教育资源均衡。整套方案采用低代码画布拖拽搭建,依托Qwen3.7-Max大模型承载内容生成能力,完整拆解节点设计、提示词配置、流程串联、测试发布全流程,同时拓展多类教育延伸应用场景
358 1
|
2月前
|
存储 缓存 数据中心
大模型多租户隔离:资源隔离、权限管控、性能互不干扰,SaaS落地场景实战.156
大模型多租户隔离是SaaS化核心,通过租户ID实现资源、权限与性能三重隔离:共享GPU/模型降低成本,逻辑隔离确保数据不交叉、请求不干扰、权限不越界,满足金融级安全与高并发稳定性要求。
321 1
|
2月前
|
人工智能 移动开发 安全
Night Plan 夜间算力特惠来袭!Qoder+Meoo 双产品 Qwen3.7 夜间低至 2 折
阿里云Night Plan上线!每晚22:00-次日8:00,Qwen3.7模型低至2折,算力成本直降80%。Qoder全系(含Desktop/CLI/Work)与Meoo秒悟均享优惠,试用/付费用户自动生效,无需开通。夜间挂机跑任务,白天专注调试,降本增效一步到位。
|
2月前
|
存储 人工智能 知识图谱
基于RAG架构的四标融合企业知识资产体系工程化建设:知识库、场景库、知识图谱与知识链接落地实践
本文提出“四标融合GEO工程方法论”,依托四项国标与ISO 42001,系统构建知识库、场景库、知识图谱、知识链接四大模块,适配RAG架构与大模型检索逻辑,解决企业知识“不可识别、不可检索、不可信赖”痛点,助力AI时代知识资产高效激活。(239字)

热门文章

最新文章