如何在asyncio.create_task()内部调用asyncio.create_task()并保证任务执行?
解决asyncio任务内创建子任务不执行的问题
问题原因
你遇到的问题本质是事件循环过早退出:
asyncio.create_task()创建的是后台任务,不会阻塞当前协程的执行。- 当
main()函数执行完毕后,asyncio.run()会立即关闭事件循环,此时task1刚创建完task2,还没来得及调度执行task2,整个程序就结束了。
解决方案
根据你的需求(运行10个循环任务,每个任务内部还要创建子任务),提供两种常用解决方式:
方式1:显式等待所有任务完成
如果你的任务是一次性执行的(非无限循环),可以保存任务对象并在 main 中等待它们完成:
import asyncio async def task2(): print("Task 2 was called") async def task1(): print("Task 1 was called") # 保存子任务对象并等待其完成 sub_task = asyncio.create_task(task2()) await sub_task async def main(): print("Main was called") # 创建10个task1任务 tasks = [asyncio.create_task(task1()) for _ in range(10)] # 等待所有任务执行完毕 await asyncio.gather(*tasks) asyncio.run(main())
方式2:让任务持续运行(适用于循环任务)
如果你的任务是需要持续循环执行的,要确保任务本身不会提前结束,同时主函数维持事件循环运行:
import asyncio async def task2(): print("Task 2 was called") # 模拟子任务的业务逻辑耗时 await asyncio.sleep(1) async def task1(): print("Task 1 was called") # 循环执行子任务 while True: asyncio.create_task(task2()) await asyncio.sleep(2) async def main(): print("Main was called") # 创建10个循环任务 for _ in range(10): asyncio.create_task(task1()) # 让主协程持续挂起,避免事件循环退出 await asyncio.Event().wait() asyncio.run(main())
关键注意点
- 禁止主协程过早结束:
asyncio.run()会在主协程完成后立即终止事件循环,所有未完成的后台任务都会被强制取消。 - 子任务的生命周期管理:对于需要确保执行完成的子任务,要么在父协程中
await,要么在主函数中统一跟踪并等待所有任务。
内容的提问来源于stack exchange,提问作者user18191682
相关产品推荐
相关产品推荐

