并发任务有依赖关系时,一个已经失败,其他任务通常也没必要继续跑。Python 3.11 的 asyncio.TaskGroup 会在组内任务抛出异常后取消其余任务,并等它们执行清理逻辑。
环境:Python 3.11+,Linux、macOS 或 Windows,只用标准库。
import asyncio
async def worker(name, delay, fail=False):
try:
await asyncio.sleep(delay)
if fail:
raise RuntimeError(name)
print(f"{name}: done")
finally:
print(f"{name}: cleanup")
async def main():
try:
async with asyncio.TaskGroup() as group:
group.create_task(worker("slow", 1))
group.create_task(worker("bad", 0.05, fail=True))
except* RuntimeError as errors:
print([str(error) for error in errors.exceptions])
asyncio.run(main())
运行后能看到两个任务都执行了 cleanup,但不会出现 slow: done。组内异常会在退出上下文时组成 ExceptionGroup,所以这里用 except* 按类型处理。相比只创建一组裸任务,TaskGroup 把取消、等待清理和异常汇总放在了同一个作用域里。