很多Python开发者写并发代码时,都会陷入一个纠结的问题:到底用多进程,还是用asyncio异步协程?
我初学并发的时候也是乱套公式:接口优化就无脑上asyncio,跑数据计算就随便开多进程。结果经常出现:异步写满CPU没用、多进程开太多导致服务器卡死、并发性能不升反降。
本质原因就是没搞懂 Python 的 GIL 全局锁机制,也分不清IO密集型和计算密集型场景的区别。今天我结合多年线上实战经验,用通俗的大白话+可运行代码对比,彻底讲清楚多进程和asyncio的适用场景,让大家以后写并发不再踩坑。
一、先搞懂核心根源:Python GIL锁
想选对并发方案,必须先理解GIL。Python的全局解释器锁,导致同一个进程同一时刻只能有一个线程执行CPU运算。
这也是为什么普通多线程在Python中鸡肋、计算任务无法利用多核的核心原因。针对这个问题,Python给出了两套解决方案:
1.多进程 multiprocessing:绕过GIL,每个进程独立GIL,真正利用多核CPU,适合算数据、跑模型。
2.asyncio 异步协程:单线程高并发,IO等待时让出CPU,适合接口、爬虫、数据库请求。
二、IO密集型场景:优先选 asyncio
什么是IO密集?简单说:大部分时间在等,不是在算。
网络请求、数据库查询、Redis操作、文件读写、接口调用,这些任务CPU基本空闲,全程在等待响应。这种场景用多进程非常浪费资源,asyncio 才是最优解。
下面给大家写一段真实爬虫IO密集对比代码:
import asyncio import time # 模拟IO等待:网络请求、查库 async def io_task(num): print(f"请求任务 {num} 开始") await asyncio.sleep(1) # 模拟IO阻塞,不占用CPU print(f"请求任务 {num} 结束") async def main(): start = time.time() tasks = [io_task(i) for i in range(10)] await asyncio.gather(*tasks) print(f"异步总耗时:{time.time() - start:.2f}s") if __name__ == "__main__": asyncio.run(main())
运行结果:10个任务串行需要10秒,asyncio仅需1秒左右完成。
原因很简单:IO等待期间线程不会卡死,而是去处理下一个任务,单线程就能实现超高并发。这也是FastAPI、异步爬虫速度碾压同步写法的根本原因。
适用场景总结:爬虫、接口服务、数据同步、读写文件、大量数据库请求。
三、计算密集型场景:只能选 多进程
计算密集型刚好相反:全程疯狂运算,几乎没有等待。
比如数值计算、数据清洗运算、矩阵处理、模型推理、批量加解密。这种场景GIL会死死锁住线程,asyncio完全没用,必须使用多进程榨干多核CPU性能。
import multiprocessing import time # 模拟CPU密集计算 def cpu_task(num): res = 0 for i in range(10000000): res += i print(f"计算任务 {num} 完成") if __name__ == "__main__": start = time.time() pool = multiprocessing.Pool(processes=4) for i in range(4): pool.apply_async(cpu_task, args=(i,)) pool.close() pool.join() print(f"多进程计算总耗时:{time.time() - start:.2f}s")
如果换成asyncio跑计算任务,耗时会翻倍,因为协程无法并行CPU运算。只有多进程能突破GIL限制,利用多核CPU提升速度。
适用场景总结:批量数据运算、图像处理、科学计算、模型推理、复杂数据统计。
四、高频踩坑总结(90%开发者都错了)
这里分享几个我线上调优遇到的典型误区,帮大家避坑:
误区1:所有并发都用asyncio。CPU计算任务强行异步,不仅不提速,还会因为事件循环切换拖慢速度。
误区2:IO任务无脑开多进程。进程创建开销极大,几百个IO请求开多进程,资源开销远大于收益,服务器负载飙升。
误区3:异步代码混用同步阻塞方法。async函数里用time.sleep、同步查库,直接卡死事件循环,异步彻底失效。
五、终极选型对照表(直接抄作业)
我整理了一份可以直接落地的选型规则,开发时直接对照即可:
✅选 asyncio / 异步
1. 接口开发、高并发服务
2. 爬虫、批量请求第三方接口
3. 大量数据库、Redis IO操作
4. 任务大量时间在等待
✅选 多进程 multiprocessing
1. 大数据量循环计算
2. 图像、音视频处理
3. 算法模型推理、数值运算
4. 需要占满多核CPU提升效率
六、混合场景最优方案
实际项目中很多场景是混合的:先请求IO获取数据,再运算处理。
最优方案是:异步负责拉取数据,多进程负责密集计算,两者结合使用,既能扛高并发,又能高效处理计算任务,这也是企业级Python项目的标准写法。
七、总结
最后一句话帮大家彻底记住:等就用异步,算就用多进程。
asyncio 解决的是「高并发等待浪费」,多进程解决的是「CPU算力不足」。只要分清IO密集和计算密集场景,你的Python并发代码性能至少翻倍,再也不会出现并发写法越写越卡的尴尬情况。
这也是面试高频考点、线上性能优化核心知识点,建议收藏,以后写并发代码直接对照选型,少走90%弯路。