asyncio.gather在python 3.12中启动耗时降25%~30%,cancellederror被统一收进结果列表,类型检查提前至调用入口,但uvloop兼容性需实测验证。

asyncio.gather 调度开销更低、CancelledError 处理更可控、协程参数校验更早——这些不是“变快了”,而是旧版本里那些隐式开销和边界混乱被切掉了。
asyncio.gather 启动耗时下降 25%~30%
旧版本中,asyncio.gather 每个传入的 awaitable 都会被包装成 Task,并伴随多次引用计数操作和状态检查;Python 3.12 精简了这个路径,尤其在并发量大(比如 1000+ 个 asyncio.sleep(0.01))时,启动阶段的事件循环队列插入和唤醒通知更轻量。
这不是靠加机器,是汇编级调度路径优化的结果。
实测中,如果你用 gather 批量调用 HTTP 客户端或数据库异步驱动,首字节延迟会更稳定,抖动减少。
return_exceptions=True 时 CancelledError 不再打断其余任务
以前即使开了 return_exceptions=True,某个子任务在取消过程中抛出 CancelledError,仍可能让整个 gather 提前退出或返回不完整结果。
Python 3.12 明确把 CancelledError 当作普通异常处理:它被收进结果列表,其余任务继续跑完。
这在超时控制密集的场景(比如带 timeout 的 API 批量请求)里很关键——你不用再在外层额外套 try/except CancelledError 来兜底。
协程类型检查提前到 gather 调用入口
旧版本里传错类型(比如把普通函数 func() 而非 await func() 传给 gather),报错可能是模糊的 RuntimeWarning: coroutine 'xxx' was never awaited,位置难定位。
Python 3.12 在 gather 内部做类型预检,直接抛 TypeError: expect an awaitable, got <class></class>,错误指向你调用 gather 的那一行。
CI 流水线里漏掉 await 或多写 async 的问题,现在能秒级暴露。
uvloop 兼容性需要实测验证
Python 3.12 的新调度器和 uvloop 存在微小间隙,不是不能用,但高并发下 gather 返回结果的顺序稳定性可能有边缘 case 波动。
升级后建议用真实负载压测,重点看:
- epoll 就绪通知与任务完成回调的时序是否一致
- 结果列表索引是否始终与输入 awaitable 的顺序严格对应
- 长时间运行后是否存在内存泄漏倾向
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











