asyncio协程是单线程内基于事件循环的并发机制,适用于I/O密集型任务,需用await或asyncio.run()执行,避免阻塞事件循环。
协程是单线程内的并发调度机制,靠事件循环(event loop)控制多个协程的挂起与恢复。它不创建新线程或进程,因此没有线程切换开销,也不涉及锁竞争。适合 I/O 密集型任务,比如网络请求、文件读写、数据库查询等。CPU 密集型任务用协程反而可能因阻塞事件循环而降低性能。
定义协程函数只需在 def 前加 async,调用时返回一个协程对象,不会立即执行。必须通过 await(在另一个协程内)或 asyncio.run() 才会真正运行。常见误区是把普通函数改成 async 却忘了 await,结果只是生成了个未被调度的对象,什么也没发生。
__await__ 的对象async def ... yield
直接 await coro 是顺序执行;想真正并发,得用 asyncio.create_task(coro) 把协程包装成 Task 并立即调度。Task 是 asyncio 中的“轻量级并发单元”,比直接 await 更灵活——可以取消、检查状态、设置回调。
await asyncio.gather(t1, t2, t3) 或先 create_task 再 await 对应 Taskawait asyncio.sleep(0) 让出控制权,避免饿死其他任务asyncio 的优势不是单次操作更快,而是单位时间内处理更多请求。优化方向集中在减少阻塞、提升吞吐、避免意外同步化。
aiohttp 替代 requests,用 aiomysql/asyncpg 替代同步驱动,确保所有 I/O 都真正异步loop.run_in_executor
(),防止阻塞事件循环logging 配合异步 handlerasyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())(Windows)或使用 uvloop(Linux/macOS)替代默认事件循环,可提升 20%~50% 吞吐