asyncio 并非万能加速器,仅对真正阻塞的IO操作有效;CPU密集型任务反会变慢,且需避免在已有事件循环中调用asyncio.run()、误用await同步函数、混淆gather与create_task、滥用Queue跨线程等常见错误。

asyncio 不是“开个协程就变快”的魔法开关,它只在真正阻塞 IO 的地方起作用;CPU 密集型任务用 asyncio 反而更慢,还容易写出伪异步代码。
asyncio.run() 是入口,但别在已有事件循环里再调用它
常见错误是把 asyncio.run() 塞进 Jupyter、Flask 或 Django 的请求处理函数里——这些环境通常已运行着自己的事件循环。直接调用会报 RuntimeError: asyncio.run() cannot be called from a running event loop。
- 开发脚本或命令行工具:放心用
asyncio.run(main()) - Web 框架中:用框架提供的异步支持(如 FastAPI 的
async def endpoint),或显式获取当前循环:asyncio.get_running_loop().create_task(...) - Jupyter 中:改用
await main()(前提是 kernel 支持)或asyncio.get_event_loop().run_until_complete(main())
await 不能乱加,不是所有函数都支持异步调用
写 await time.sleep(1) 或 await json.loads(data) 会直接报错——它们是同步函数,不返回 Awaitable。asyncio 只能调度真正基于 async/await 或底层 loop.run_in_executor() 封装的 IO 操作。
- 网络请求:用
aiohttp、httpx.AsyncClient,别用requests - 文件读写:用
aiofiles,不是内置open() - 数据库:选
asyncpg、aiomysql、tortoise-orm等原生异步驱动 - 想包装同步函数?必须用
loop.run_in_executor(),且注意线程池默认大小是min(32, os.cpu_count() + 4),高并发时可能成瓶颈
asyncio.gather() 和 asyncio.create_task() 的选择取决于依赖关系
两者都并发执行多个协程,但调度时机和错误传播行为不同。误用会导致任务被忽略、异常静默或顺序执行。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
立即学习“Python免费学习笔记(深入)”;
- 无依赖、全量等待:用
asyncio.gather(task1(), task2(), task3()),任一失败整个抛异常 - 有依赖或需提前启动:用
task = asyncio.create_task(task1())启动,之后await task或与其他任务组合 - 想忽略某个任务失败?用
asyncio.gather(..., return_exceptions=True),否则第一个异常就中断全部 - 别在循环里反复
create_task()却不 await —— 任务会堆积,内存泄漏,且无法捕获异常
asyncio.Queue 适合协程间通信,但别当线程安全队列用
asyncio.Queue 是协程安全的,但不是线程安全的。拿它往线程里传数据(比如从 ThreadPoolExecutor 回调里 put_nowait()),会触发 RuntimeError: A task was cancelled 或静默丢数据。
- 纯协程协作(生产者/消费者都在同个 event loop):放心用
asyncio.Queue - 跨线程场景:用
queue.Queue+loop.call_soon_threadsafe()中转 - 注意
get()和put()都是 awaitable,别漏掉await;qsize()在高并发下不可靠,别用它做条件判断
asyncio 的性能收益高度依赖 IO 阻塞时间与并发数的比值——如果每次请求只等 10ms,却开了 1000 个任务,调度开销可能盖过收益;真正卡住的是 DNS 解析、TLS 握手或慢后端响应,这些才是优化靶心。


















