为何Asyncio两种任务调度场景下main() coro的执行表现不同?
问题解析:为什么示例2的main()只执行一次?
核心原因是示例2中await task1的行为和示例1中await asyncio.sleep(0.1)完全不同,导致main()协程被永久挂起,无法回到while循环继续执行。
示例1的正常逻辑
示例1中,main()的循环逻辑是:
- 打印
main() await asyncio.sleep(0.1):这个操作会让main()暂时让出控制权给事件循环,同时设置一个0.1秒后的唤醒事件。- 0.1秒后,事件循环会唤醒main(),main()回到while循环的开头,重复执行打印和sleep操作。
与此同时,task1和task2也各自在sleep到期后被事件循环唤醒,所以三个任务会轮流被调度,形成main() → coro1() → coro2() → main() → ...的循环输出。
示例2的问题所在
示例2中,main()的循环逻辑出现了关键错误:
- 第一次循环:打印
main()后,执行await task1。 await task1的含义是等待task1这个任务完全结束,但task1是一个无限循环的协程(while True永远不会退出),所以它永远不会进入“完成”状态。- 当main()执行
await task1时,它会被挂起,直到task1完成——但这个时刻永远不会到来。 - 虽然task1和task2会因为sleep到期被反复唤醒、执行,但main()一直处于等待task1完成的挂起状态,事件循环不会再去唤醒main(),自然也就不会再执行
print('main()')。
简单来说:示例1的main()是周期性被唤醒,而示例2的main()是在等待一个永远不会结束的任务,直接“卡死”在挂起状态,再也无法回到循环开头。
内容的提问来源于stack exchange,提问作者varuserx
相关产品推荐
相关产品推荐

