You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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()的循环逻辑出现了关键错误:

  1. 第一次循环:打印main()后,执行await task1。
  2. await task1的含义是等待task1这个任务完全结束,但task1是一个无限循环的协程(while True永远不会退出),所以它永远不会进入“完成”状态。
  3. 当main()执行await task1时,它会被挂起,直到task1完成——但这个时刻永远不会到来。
  4. 虽然task1和task2会因为sleep到期被反复唤醒、执行,但main()一直处于等待task1完成的挂起状态,事件循环不会再去唤醒main(),自然也就不会再执行print('main()')。

简单来说:示例1的main()是周期性被唤醒,而示例2的main()是在等待一个永远不会结束的任务,直接“卡死”在挂起状态,再也无法回到循环开头。

内容的提问来源于stack exchange,提问作者varuserx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 19:01:24