Python中while True循环内await asyncio.sleep()的阻塞问题咨询
代码实际运行行为分析
你的这段asyncio代码的实际运行行为基本符合你的预期,但有个小细节需要注意,下面一步步拆解:
实际运行流程
- 程序启动后,
main()函数会先获取事件循环,打印starting loop - 调用
loop.run_until_complete(asyncio.gather(task()))时,事件循环开始调度执行task()协程:- 首先执行
print("doing task"),输出doing task - 进入无限
while True循环,先打印while true looping,然后遇到await asyncio.sleep(2):此时协程会被挂起,事件循环等待2秒后唤醒它 - 2秒后,协程恢复执行,再次打印
while true looping,然后又挂起等待2秒,如此周而复始
- 首先执行
- 因为
task()是无限循环的协程,asyncio.gather()永远不会完成,所以loop.run_until_complete()会一直阻塞,程序会持续运行,直到你手动终止(比如按下Ctrl+C)
和你预期的差异
你预期的循环输出是while true loop,但代码里写的是print("while true looping"),所以实际输出的是带ing的版本,这是个小笔误。
额外优化提示
如果想要让这个协程能够被优雅终止,你可以考虑给协程添加终止条件,或者使用asyncio.create_task()结合事件循环的run_forever(),再配合信号处理来实现优雅退出,但这是额外的优化点啦。
内容的提问来源于stack exchange,提问作者3tbraden
相关产品推荐
相关产品推荐

