asyncio.wait_for()调用await asyncio.sleep(0.0)未抛出TimeoutError的疑问
asyncio.wait_for超时与sleep(0.0)的调度优先级问题
结论
这是故意设计的行为,asyncio.sleep(0.0)的唤醒回调调度优先级确实高于wait_for的超时/取消回调。
核心逻辑
asyncio事件循环处理回调是按到期时间先后来的:所有触发时间≤当前时间的回调会被优先执行,之后才轮得到未来才到期的回调。
asyncio.sleep(0.0)会注册一个触发时间等于当前时间的唤醒回调,属于“立即到期”的范畴,优先级极高。wait_for的超时回调是通过call_later(超时时间, 取消逻辑)注册的,触发时间是当前时间加上你设定的超时时长——哪怕这个时长极小(比如0.00000005秒),只要是正数,就会比sleep(0.0)的回调晚触发。
对应你的测试场景
- test_timeouterror_1(sleep_before_return=0.0000001):这个sleep的延迟是正数,触发时间晚于超时回调的触发时间。事件循环先执行超时回调,直接取消目标协程,所以
await wait_for()会抛出TimeoutError。 - test_timeouterror_2(sleep_before_return=0.0):sleep的唤醒回调立即到期,事件循环先执行它,让目标协程继续跑完。此时
wait_for的超时回调还没到触发时间,取消逻辑根本没机会触发,自然不会抛出超时异常。
关于官方文档的说明
官方提到await sleep(0.0)会“跳过一个事件循环运行周期”,说白了就是让当前协程主动让权,让事件循环先处理所有已经就绪(或当前到期)的回调——包括它自己的唤醒回调。这种设计是为了给其他任务留执行机会,同时保证sleep(0.0)的协程能快速恢复执行。
内容的提问来源于stack exchange,提问作者timmwagener
相关产品推荐
相关产品推荐

