尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

asyncio里面的await理解

asyncio里面的await理解 这5个await不是“5个独立任务”而是同一个协程里的5个“暂停点”只有用create_task()创建出来的才是独立任务事件循环才会在它们之间切换调度。 核心区分await是暂停点create_task()才是创建任务情况一串行await不是并发如果在一个协程里顺序写5个await事件循环会一个一个按顺序执行前一个完成后才执行下一个这本质上还是串行的asyncdefmain():result1awaittask_a()# 等task_a完成才往下走result2awaittask_b()# 等task_b完成才往下走result3awaittask_c()result4awaittask_d()result5awaittask_e()情况二用create_task()创建5个独立任务真正的并发这才是你描述的场景。事件循环会同时启动这5个任务谁先完成就先拿到谁的结果asyncdefmain():t1asyncio.create_task(task_a())t2asyncio.create_task(task_b())t3asyncio.create_task(task_c())t4asyncio.create_task(task_d())t5asyncio.create_task(task_e())# 5个任务同时在跑谁先完成谁先返回r1awaitt1 r2awaitt2# ...⚙️ 事件循环的调度过程以5个独立任务为例事件循环的调度流程如下5个任务被注册到事件循环的就绪队列事件循环取出任务A开始执行遇到await比如网络请求任务A暂停进入等待队列事件循环取出任务B开始执行遇到await任务B也暂停依次类推5个任务都暂停在各自的await处此时事件循环监听I/O事件哪个任务的I/O先完成比如某个HTTP请求先返回了就把那个任务移回就绪队列事件循环恢复那个任务从await的下一行继续执行核心总结不是事件循环“安排顺序”而是谁先完成谁先被恢复完全取决于I/O操作的实际完成时间。 收集结果的三种方式asyncio.gather()等所有任务完成按传入顺序返回结果列表不管实际完成顺序asyncio.wait()更灵活可以设置“第一个完成就返回”或“全部完成才返回”asyncio.as_completed()谁先完成就先拿到谁的结果按完成顺序返回# 按完成顺序拿结果最符合你的描述forcoroinasyncio.as_completed([task_a(),task_b(),task_c(),task_d(),task_e()]):resultawaitcoroprint(f拿到结果:{result})# 先完成的先打印 一句话总结await是“暂停点”create_task()是“创建独立任务”事件循环是“调度员”——它不安排顺序而是谁先完成就先处理谁。
返回列表