python异步编程核心是async/await协作式并发机制,用单线程高效处理i/o任务;async def定义协程函数,返回协程对象,需事件循环驱动;await在协程内挂起并让出控制权,等待可等待对象就绪;事件循环(如asyncio.run)调度协程实现并发。

Python异步编程的核心是 async 和 await,它们不是线程或进程,而是一套协作式并发机制——用单线程高效处理大量 I/O 等待任务,比如网络请求、文件读写、数据库查询。
async 函数:协程的声明方式
用 async def 定义的函数不是普通函数,而是“协程函数”。调用它不会立即执行,而是返回一个协程对象(coroutine object)。
例如:
>>> async def fetch_data():
return "done"
>>> coro = fetch_data() # 不执行,只创建协程对象
>>> type(coro)
立即学习“Python免费学习笔记(深入)”;
协程对象必须被事件循环驱动(如 asyncio.run())才能真正运行。
await 表达式:挂起与恢复的开关
await 只能在 async def 函数内部使用,作用是:暂停当前协程,把控制权交还给事件循环,等被 await 的对象(通常是另一个协程、Future 或实现了 __await__ 的对象)就绪后再继续。
关键点:
- await 后的对象必须是“可等待对象”(awaitable),比如其他协程、asyncio.sleep()、loop.create_task() 返回的 Task 等
- await 不会阻塞整个线程,只是让出执行权,允许其他协程运行
- 不能在普通函数里写 await,否则报 SyntaxError
事件循环:async/await 的运行引擎
async/await 本身不自动运行,需要事件循环调度。最简单的方式是用 asyncio.run()(Python 3.7+ 推荐):
import asyncio
async def main():
print("start")
await asyncio.sleep(1) # 模拟耗时 I/O
print("done")
asyncio.run(main()) # 启动事件循环并运行 main 协程
事件循环会管理所有 await 暂停/恢复的协程,实现并发效果——多个协程交替执行,而非同时运行(注意:不是并行)。
并发不等于并行:asyncio.gather 与 asyncio.create_task
想让多个协程“看起来同时进行”,要用 asyncio.gather() 或显式创建 Task:
- gather():批量等待多个协程,全部完成才返回结果(按调用顺序返回)
- create_task():把协程包装成 Task 并立即调度,适合需要提前启动、或需取消/监控的场景
例如并发发 3 个 HTTP 请求,用 gather 可以避免串行等待,总耗时接近最长那个请求,而非三者之和。











