请说明 Python 中 asyncio 异步编程的实现方式,包括其核心组件与基本用法。
考察说明
考查候选人对 Python asyncio 异步编程核心机制和实际应用的掌握程度。
回答思路
- 【回答框架 1】asyncio 是 Python 用于编写并发代码的库,通过协程和事件循环实现单线程内的异步 I/O。核心组件包括事件循环(event loop)、协程(coroutine)、任务(Task)和 Future。事件循环负责调度协程,处理 I/O 事件和回调。
- 【回答框架 2】定义协程需使用 async def 声明函数,调用返回协程对象,须通过 await 等待或交给事件循环执行。使用 asyncio.run(main()) 可创建事件循环并运行顶层协程,该函数负责管理循环的生命周期。
- 【回答框架 3】创建任务可使用 asyncio.create_task(coro),任务作为协程的调度单元,可被并发执行。并发执行多个协程可使用 asyncio.gather,它会等待所有协程完成并返回结果列表;使用 asyncio.wait 可根据条件等待部分任务完成。
- 【回答框架 4】异步 I/O 操作需使用 await 挂起当前协程,将控制权交还事件循环,使其他任务运行。例如 aiohttp 的请求、asyncio.open_connection 等库原生支持异步。同步阻塞操作会阻塞事件循环,需使用 to_thread 或 run_in_executor 放入线程池执行。
- 【回答框架 5】使用 asyncio 需要注意错误处理和资源清理。await 可捕获异常,任务取消需使用 Task.cancel。为确保资源释放,可使用 async with 管理异步上下文,或在 finally 中清理。事件循环无法在 Windows 的 Proactor 事件循环外跨线程运行。
- 【关键点 1】asyncio 基于事件循环调度协程,实现单线程异步 I/O。
- 【关键点 2】使用 async def 定义协程,await 挂起等待 I/O,asyncio.gather 并发执行多个协程。
- 【关键点 3】阻塞任务用 to_thread 或 run_in_executor 避免阻塞事件循环。
- 【关键点 4】asyncio.run 是主流入口,负责创建和关闭事件循环。
- 【关键点 5】注意异常处理与任务取消,使用 asyncio.Queue 或 semaphore 控制复杂场景。
- 【易错点 1】直接调用协程函数不会执行内部代码,必须 await 或包装为任务。
- 【易错点 2】在协程中使用同步阻塞 I/O 会阻塞整个事件循环,降低并发性能。
- 【易错点 3】忘记 await 或错误使用 asyncio.wait 导致任务未完成或死锁。