asyncio的loop.create_task运行行为疑问:打印次数不符合预期
现象原因
你提交的3个异步任务仅执行完第一次打印就终止,核心原因是主协程没有等待后台任务执行完成就提前退出:
- 你在
run_test中仅通过create_task把3个test协程注册到事件循环,没有添加等待逻辑 - 三个任务第一次执行
print后,遇到await asyncio.sleep(1)会主动让出CPU控制权,此时事件循环切回主协程run_test run_test没有其他后续逻辑,直接执行结束,asyncio.run()会在主协程结束后自动销毁事件循环,未完成的后台任务会被直接终止,因此不会执行剩下的4轮打印逻辑
修复代码
你只需要将创建的任务收集起来,主动等待所有任务执行完成即可,修改后的完整代码如下:
import asyncio CONNECTIONS = 3 REPEAT = 5 async def test(payload): for i in range(REPEAT): print(payload) await asyncio.sleep(1) async def run_test(): tasks = [] for i in range(CONNECTIONS): # 收集所有创建的任务对象 tasks.append(asyncio.create_task(test(f"Hello World {i}"))) # 等待所有任务执行完毕,主协程才会结束 await asyncio.gather(*tasks) asyncio.run(run_test())
修改后运行代码,就会按预期输出每个字符串各5次,每轮打印间隔1秒。
内容的提问来源于stack exchange,提问作者Pawan Goyal
相关产品推荐
相关产品推荐

