Swift异步任务依赖处理:嵌套任务的相互终止需求咨询
异步任务流的依赖启动与终止实现方案
核心需求回顾
- Task1(
stream1)输出结果result1,当result1 == A时启动唯一的Task2(stream2) - 若Task2输出
result2 == X,则Task2需等待Task1的流结束后自行终止 - 若Task1输出
result1 == B(此时Task2已启动),则Task1需等待Task2的流结束后自行终止
实现思路
- 用状态变量跟踪关键状态:
task2_started(标记Task2是否已启动)、task2_await_task1(标记Task2是否需等待Task1结束)、task1_await_task2(标记Task1是否需等待Task2结束) - 同时监听两个异步流,处理每个输出结果触发的状态变更
- 流处理结束后,根据状态变量执行对应的等待逻辑,确保满足终止条件
代码示例(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
相关产品推荐
相关产品推荐

