标准答案
- async def 调用返回 coroutine,create_task 将其放入事件循环调度。
- await 等待 Future 或可等待对象,在等待期间让出当前事件循环。
- 同步计算和阻塞 I/O 会占住事件循环,需优化、拆分或放到线程/进程执行器。
- 任务需要保存引用、处理异常和在关闭时取消,否则可能出现悬挂任务。
题目解析
async def 调用只返回 coroutine,事件循环要通过 await 或 create_task 才会执行。协程在 await 处让出执行权,任何同步计算或阻塞 I/O 都会占住事件循环。
任务应有父作用域、取消、异常读取和结束等待。丢弃 Task 会让异常变成日志噪音或让任务脱离请求生命周期长期运行。
异步链路的收益依赖端到端非阻塞:HTTP、数据库、文件、序列化和锁都要检查。无法异步化的依赖要放入有界线程/进程执行器。
常见误区
- 误区:创建 coroutine 却忘记 await 或 create_task。改正:明确是顺序等待还是受控并发,并测试任务完成。
- 误区:async handler 里调用 requests 或同步文件 API。改正:使用 async 客户端或隔离到 executor。
- 误区:任务异常无人读取。改正:保存任务引用、await/gather 或由 TaskGroup 统一收集异常。