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

如何控制Asyncio TaskGroup任务执行顺序以实现指定输出?

问题1:TaskGroup 任务执行顺序控制

核心问题是main中的任务与multi_coro内部的任务组处于并发状态,导致multi_coro的子任务和main的其他任务抢占调度。要让multi_coro内部所有任务执行完毕后再运行main的第二个任务,只需在main中直接await multi_coro(),而非将其作为独立任务加入TaskGroup。

修正后的代码示例:

import asyncio

async def coro(num):
    print(num)

async def multi_coro():
    async with asyncio.TaskGroup() as tg:
        tg.create_task(coro(5))
        tg.create_task(coro(6))
        tg.create_task(coro(7))

async def main():
    async with asyncio.TaskGroup() as tg:
        tg.create_task(coro(1))
        tg.create_task(coro(2))
        tg.create_task(coro(3))
        tg.create_task(coro(4))
    # 等待multi_coro内部任务组全部执行完成
    await multi_coro()
    await multi_coro()
    async with asyncio.TaskGroup() as tg:
        tg.create_task(coro(8))

asyncio.run(main())

这样就能保证5、6、7连续出现两次且在8之前(1-4的顺序可能因调度略有波动,但整体符合你的预期输出逻辑)。

问题2:依赖任务的顺序触发

要实现「i=0的任务执行后立即启动10、100的任务,而非先执行i=2」,核心是建立任务间的依赖关系,控制10、100任务的启动时机:

方案1:先完成i=0,再并行启动所有后续任务

如果要求i=2必须在i=0之后执行,可采用此方案:

import asyncio

async def coro(num):
    print(f"任务{num}执行")

async def main():
    # 先等待i=0任务执行完毕
    await coro(0)
    # 并行启动10、100、i=2的任务
    await asyncio.gather(coro(10), coro(100), coro(2))

asyncio.run(main())

输出顺序固定为任务0执行在前,10、100、i=2的任务在其后并行执行。

方案2:i=0与i=2并行,10、100等待i=0完成

如果允许i=2和i=0同时启动,但要求10、100必须在i=0完成后立即执行:

import asyncio

async def coro(num):
    print(f"任务{num}执行")

async def main():
    # 同时启动i=0和i=2的任务
    task0 = asyncio.create_task(coro(0))
    task2 = asyncio.create_task(coro(2))
    # 等待i=0完成后,立即启动10、100
    await task0
    await asyncio.gather(coro(10), coro(100))
    # 等待i=2任务收尾(如果需要)
    await task2

asyncio.run(main())

此方案中i=2可能先于i=0执行,但10、100一定会在i=0完成后启动,满足你核心的顺序需求。

内容的提问来源于stack exchange,提问作者Hadevmin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:40:35