从等待问题开始
每章先看一个普通 Python 程序的问题,再讲 asyncio 在这里做了什么。
用一组可运行的小程序理解 asyncio:连续 await、gather、create_task、限流、超时、Queue、TCP echo。每一节只增加一个问题,并把代码背后的事件循环、Future、Task 和取消规则讲清楚。
asyncio 经常被讲成“单线程并发”或“遇到 I/O 就切换”。这句话没错,但不够用。只要程序里有几个同时进行的 I/O 操作,你还得弄清楚几件具体的事:
async def 调用后为什么不立刻执行。await 到底把控制权交给了谁。create_task 为什么能让多个协程早点开始跑。TaskGroup 为什么比裸 gather 更适合管一组相关任务。StreamWriter.drain() 为什么不是装饰性的等待。本教程按这个顺序来:
如果目标是把 asyncio 用在日常 I/O 代码里,读完“起步”和“练习代码”就够用。要继续看清它为什么这样运行,再读“运行过程”和“Mini Asyncio”。