如何在Python asyncio中实现指定任务的阻塞控制?
如何让异步任务A、B并行执行后再启动同步任务C?
你的原代码里,await A()之后再await B()是串行执行的——A执行完才会启动B,这不符合“A与B互不阻塞”的要求。要实现A、B并行,且C必须等两者都完成后再执行,可以用以下两种方式:
方法一:使用asyncio.gather()
asyncio.gather()可以批量运行多个异步任务,并等待所有任务完成后再继续执行后续代码,是实现并发等待最简洁的方式。
import asyncio async def A(): print("A 开始执行") await asyncio.sleep(2) # 模拟异步耗时操作 print("A 执行完成") async def B(): print("B 开始执行") await asyncio.sleep(1) # 模拟异步耗时操作 print("B 执行完成") def C(): print("C 开始执行") async def handler(): # 让A和B并行执行,等待两者全部完成 await asyncio.gather(A(), B()) # 此时A、B均已完成,启动C C() asyncio.run(handler())
运行后你会看到A和B几乎同时启动,等两者都结束后才会执行C,完全满足需求。
方法二:使用asyncio.create_task()手动创建并发任务
如果需要更灵活地控制异步任务(比如中途取消任务),可以手动创建任务对象,再等待它们完成:
import asyncio async def A(): print("A 开始执行") await asyncio.sleep(2) print("A 执行完成") async def B(): print("B 开始执行") await asyncio.sleep(1) print("B 执行完成") def C(): print("C 开始执行") async def handler(): # 创建任务并立即加入事件循环,A和B会同时开始执行 task_a = asyncio.create_task(A()) task_b = asyncio.create_task(B()) # 等待两个任务全部完成 await task_a await task_b # 启动C C() asyncio.run(handler())
关键说明
不管用哪种方式,核心逻辑都是先让A和B并发运行,再等待两者全部结束后调用C。因为C是同步函数,只要在await所有异步任务之后调用,就天然保证了C只会在A、B完成后启动——不需要额外的依赖或同步机制,完全符合你“C不依赖A、B输出”的前提。
内容的提问来源于stack exchange,提问作者jbuddy_13
相关产品推荐
相关产品推荐

