asyncio比threading/multiprocessing更适合高并发i/o密集型服务,因其单线程事件循环可承载数万并发连接、内存仅增数百mb、无系统调用与上下文切换开销、协程间共享变量天然线程安全,且await链路清晰易调试;但要求所有i/o操作真正异步,cpu密集任务须移出事件循环。

因为 asyncio 能用单线程扛住数万并发连接,而内存只涨几百 MB,且不卡主线程、不抢锁、不掉进回调地狱——前提是所有 IO 操作都真正异步。
asyncio 为什么比 threading/multiprocessing 更适合高并发 IO
IO 密集型服务(比如 HTTP API、WebSocket 接入、数据库代理)的瓶颈从来不是 CPU 算得慢,而是等网络响应、等磁盘读写、等下游服务返回。threading 创建 1000 个线程,光是线程栈就占掉 1GB 内存,OS 调度开销也随数量陡增;multiprocessing 更重,进程间通信复杂、共享状态难办。
asyncio 把“等待”这件事从阻塞变成让出:一个协程调用 aiohttp.ClientSession.get() 时,事件循环立刻切走,去跑另一个已就绪的协程;等 TCP 包回来,再唤醒它。整个过程在用户态完成,没有系统调用、没有上下文切换、没有锁竞争。
- 10 万个长连接,在 asyncio 中常驻内存约 200–400MB;同等规模用 threading,大概率 OOM
- 协程之间共享变量天然线程安全(单线程执行),
counter += 1不用加threading.Lock - await 链路清晰,异常能自然向上冒泡,不像 callback 嵌套五层后连 traceback 都看不懂
asyncio.run() 启动的事件循环有啥限制
默认事件循环绑定在主线程,无法利用多核——这不是缺陷,是设计取舍。它只负责调度 IO 任务,不负责算力。
一旦你在协程里写了 sum(range(10**8)) 或正则暴力匹配,整个事件循环就卡死,其他所有协程全部饿死。
- CPU 密集型工作必须移出事件循环:用
loop.run_in_executor()丢给concurrent.futures.ProcessPoolExecutor或ThreadPoolExecutor -
asyncio.sleep()是模拟等待,不阻塞;但time.sleep()是同步阻塞,绝对不能出现在协程里 - 第三方库若没提供 async 接口(比如用
requests.get()替代aiohttp.ClientSession.get()),会直接拖垮整个 loop
常见误用:协程写了,但根本没并发起来
很多人写了 async def fetch(url),然后用 for 循环一个个 await,结果性能还不如 requests + threading。并发的关键不是“用了 async”,而是“让多个协程同时被调度”。
- 错误写法:
for url in urls: await fetch(url)→ 串行执行 - 正确写法:
await asyncio.gather(*[fetch(u) for u in urls])或asyncio.create_task()显式提交 - 注意
asyncio.gather()默认按输入顺序返回结果;如果想按完成顺序处理,改用asyncio.as_completed() - 如果任务量极大(比如 10 万 URL),别一次性全扔进
gather,要用asyncio.Semaphore控制并发数,防爆内存或打崩下游
uvloop 和 asyncpg 这类库为什么重要
asyncio 标准事件循环(selector)够用,但不是最优。uvloop 是 libuv 的 Python 封装,把事件循环换成 C 实现,吞吐常提升 2–3 倍;asyncpg 则绕过 psycopg2 的同步包装,直接对接 PostgreSQL 协议,查询延迟更低、连接复用更稳。
- 启用 uvloop 只需两行:
import uvloop; asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) - asyncpg 的
pool.acquire()是真正的异步连接池,而 aiomysql 的连接池在高负载下偶有泄漏风险 - 别迷信“async 就一定快”:如果数据库本身只有 4 个连接槽,你开 1000 个协程抢连接,照样排队等,瓶颈不在 Python 层
真正难的不是写 async/await,而是判断哪段该 await、哪段该 run_in_executor、哪段该加限流、哪段其实根本不该异步——这些边界,往往在压测时才暴露出来。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











