如何控制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
相关产品推荐
相关产品推荐

