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

Swift异步任务依赖处理:嵌套任务的相互终止需求咨询

异步任务流的依赖启动与终止实现方案

核心需求回顾

  • Task1(stream1)输出结果result1,当result1 == A时启动唯一的Task2(stream2)
  • 若Task2输出result2 == X,则Task2需等待Task1的流结束后自行终止
  • 若Task1输出result1 == B(此时Task2已启动),则Task1需等待Task2的流结束后自行终止

实现思路

  1. 用状态变量跟踪关键状态:task2_started(标记Task2是否已启动)、task2_await_task1(标记Task2是否需等待Task1结束)、task1_await_task2(标记Task1是否需等待Task2结束)
  2. 同时监听两个异步流,处理每个输出结果触发的状态变更
  3. 流处理结束后,根据状态变量执行对应的等待逻辑,确保满足终止条件

代码示例(Python AsyncIO)

import asyncio
from typing import AsyncGenerator

# 模拟Task1的异步流
async def task1_stream() -> AsyncGenerator[str, None]:
    yield "C"
    await asyncio.sleep(0.5)
    yield "A"  # 触发启动Task2
    await asyncio.sleep(0.5)
    yield "B"  # 触发Task1等待Task2结束
    await asyncio.sleep(0.5)
    yield "D"
    await asyncio.sleep(0.5)

# 模拟Task2的异步流
async def task2_stream() -> AsyncGenerator[str, None]:
    yield "Y"
    await asyncio.sleep(0.5)
    yield "X"  # 触发Task2等待Task1结束
    await asyncio.sleep(0.5)
    yield "Z"
    await asyncio.sleep(0.5)

async def main():
    task2_started = False
    task2_await_task1 = False
    task1_await_task2 = False
    task2_task = None

    async def run_task1():
        nonlocal task1_await_task2, task2_started
        async for result1 in task1_stream():
            print(f"Task1输出: {result1}")
            if result1 == "A" and not task2_started:
                # 启动Task2
                nonlocal task2_task
                task2_task = asyncio.create_task(run_task2())
                task2_started = True
            elif result1 == "B":
                # Task1需等待Task2结束
                task1_await_task2 = True
        
        # Task1流结束后,检查是否需要等待Task2,或通知Task2可以终止
        print("Task1流已结束")
        if task2_await_task1 and task2_task:
            # 等待Task2自行终止
            await task2_task

    async def run_task2():
        nonlocal task2_await_task1
        async for result2 in task2_stream():
            print(f"Task2输出: {result2}")
            if result2 == "X":
                # Task2需等待Task1结束
                task2_await_task1 = True
        
        # Task2流结束后,检查是否需要通知Task1可以终止
        print("Task2流已结束")
        if task1_await_task2:
            # Task1会自行等待当前任务完成
            pass

    # 启动Task1
    task1_task = asyncio.create_task(run_task1())
    await task1_task

if __name__ == "__main__":
    asyncio.run(main())

关键逻辑说明

  • Task2启动:在Task1的流中检测到result1 == A且Task2未启动时,创建并启动Task2的异步任务
  • Task2等待Task1终止:当Task2输出result2 == X时,标记task2_await_task1为True,Task1流结束后会等待Task2完成
  • Task1等待Task2终止:当Task1输出result1 == B时,标记task1_await_task2为True,Task1流结束后会等待Task2的任务完成
  • 状态隔离:用nonlocal关键字在嵌套异步函数中共享状态变量,确保状态变更能被正确感知

内容的提问来源于stack exchange,提问作者sudhanshu-shishodia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:12:42