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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 15:31:05