Python 的多线程就是个摆设?不,原来是你没选对IO场景,这差距大到离谱 一个加班的夜晚凌晨两点办公室只剩你一个人。屏幕上是一段爬虫代码你要抓取一万个网页的数据。单线程跑了一个小时才完成不到三分之一。你心想Python不是支持多线程吗开几个线程一起跑速度不就翻倍了于是你花十分钟改成了多线程版本信心满满地运行——结果傻眼了速度几乎没变。甚至CPU占用率倒是上去了但进度条还是慢得像蜗牛爬。你开始怀疑人生Python的多线程是不是就是个摆设别急。你不是一个人遇到这个问题。无数Python开发者都在这条路上踩过坑——包括我自己。今天咱们就掰开揉碎聊清楚Python的多线程到底有没有用什么时候有用什么时候不仅没用反而更慢。先讲个故事GIL是个什么玩意儿要理解多线程为什么有时候不灵得先认识一个东西——GIL全称叫全局解释器锁Global Interpreter Lock。它是CPython就是咱们平时用的那个Python解释器里的一个机制。简单说就是同一时刻只有一个线程能执行Python的字节码。什么意思呢打个比方——你开了一家奶茶店店里只有一个操作台这就是GIL。你雇了10个员工线程但不管多少人同一时间只能有一个人在操作台前面做奶茶。其他人要么在等要么在干别的不需要操作台的活儿比如招呼客人、打包。所以就算你的电脑有8个CPU核心跑Python多线程程序时真正干Python代码活的永远只有一个核心。那问题来了既然只能有一个线程执行代码多线程还有什么意义答案是看场景。场景一CPU密集型任务——开再多线程也没用什么叫CPU密集型就是那种大量消耗CPU计算资源的活儿比如计算圆周率小数点后一亿位训练一个机器学习模型处理海量数据的排序和统计图片滤镜处理这些任务的特点是CPU一直在吭哧吭哧算基本不休息。咱们做个实验。假设要计算1到100万之间的质数个数单线程跑完需要28.63秒。改成4个线程一起跑你猜多久29.15秒。不仅没快反而慢了0.52秒。为什么会这样因为4个线程在抢同一个操作台GIL。每个线程干一会儿就得让位给下一个换来换去还要花时间这叫上下文切换开销。结果就是并行没实现开销倒增加了。有开发者做过一个更直观的测试单线程执行1亿次减操作耗时约6.5秒两个线程各执行5千万次时总耗时反而增加到6.8秒。多线程比单线程还慢——这跟直觉完全相反。所以结论很扎心对于纯计算型任务Python的多线程确实是个摆设。那CPU密集型任务想加速怎么办用多进程multiprocessing。每个进程有自己的GIL可以跑在不同的CPU核心上真正实现并行。同样是上面的质数计算4进程只需要7.82秒接近4倍提速。场景二IO密集型任务——多线程的神仙时刻再来看另一种任务IO密集型。IO就是输入输出Input/Output包括网络请求爬虫、调用API读写文件数据库查询这类任务的特点是大部分时间在等。你发一个网络请求数据从服务器传回来需要几百毫秒。这段时间CPU是闲着的啥也没干就在那儿干等。这时候多线程就派上用场了。还是做实验。模拟20个网络请求每个请求等1秒左右单线程顺序执行5.12秒。4个线程并发执行1.28秒。提速接近4倍。为什么会这样还记得GIL吗——那个只有一个操作台的奶茶店。当一个线程发起网络请求后它就在那儿等服务器回复。这时候它不需要操作台了。GIL就会自动释放让其他线程上去用操作台。等数据回来了这个线程再重新获取GIL继续处理结果。换句话说线程在等待IO的时候不占用GIL其他线程可以趁机执行。这就实现了“伪并行”——虽然同一时刻只有一个线程在执行Python代码但多个线程可以交替工作把等待时间充分利用起来。有开发者测试过网络请求场景多线程的执行速度大约是单线程的2倍。另一个测试中线程数增加到5倍时速度提升约3.8倍接近线性增长。所以结论是对于网络请求、文件读写这类IO密集型任务Python的多线程非常有用。那多进程呢IO场景下反而更慢你可能会想既然多进程能绕过GIL那IO密集型任务也用多进程不更好事实恰恰相反。同样是上面那个20个网络请求的实验4线程1.28秒4进程1.35秒多进程反而更慢一点。原因是创建进程的开销远大于创建线程。进程有自己独立的内存空间创建和销毁都要花更多资源。对于IO密集型任务线程已经能很好地利用等待时间了没必要用更重的进程。一张图总结任务类型多线程多进程推荐方案CPU密集型计算、运算❌ 更慢✅ 接近线性提速多进程IO密集型网络、文件、DB✅ 大幅提速⚠️ 略慢于多线程多线程实际工作中怎么选判断标准很简单看你的程序是把时间花在“算”上还是花在“等”上。如果你的程序CPU一直100%满负荷运转——用多进程。如果你的程序大部分时间在等网络响应、等磁盘读写——用多线程。很多实际项目是混合型的。比如一个爬虫程序下载网页IO密集型 → 用多线程解析HTMLCPU密集型 → 用多进程这时候可以把两者结合起来用多进程池处理解析用多线程池处理下载。顺便提一句Python 3.13的新变化从Python 3.13开始官方支持了一个叫自由线程free-threading的构建模式可以禁用GIL。在这个模式下多线程终于可以在CPU密集型任务上实现真正的并行。有测试显示在M4 MacBook Air上实现了2.83倍的提速。不过注意目前这还是个实验性功能默认并没有启用。在生产环境中大部分项目用的还是带GIL的常规Python。所以理解GIL的规则、知道什么时候该用多线程什么时候该用多进程——依然是每个Python开发者的必修课。回到开头那个故事凌晨两点你写的爬虫慢得像蜗牛。现在你知道了问题不在于“Python的多线程没用”而在于你没搞清楚自己的任务类型。如果你爬虫的瓶颈是网络请求的等待时间——开多线程速度立竿见影。如果你爬虫的瓶颈是解析网页的CPU计算——开再多线程也没用改用多进程。同样是多线程用对场景是神器用错场景是摆设。这差距真的离谱。