搜索
查找主题、作者或分类。
Python 3.11:用 asyncio.TaskGroup 让并发失败自动收尾还可以补一个常见边界:给整个任务组设置总时限。Python 3.11 的 `asyncio.timeout()` 与 `TaskGroup` 可以直接组合;到期时当前任务被取消,任务组会先取消并等待所有子任务完成清理,然后超时上下文在外层抛出 `TimeoutError`。
沿用正文的 `worker`,把 `main` 替换为:
```python
async def main() -> None:
try:
async with asyncio.timeout(0.20):
async with asyncio.TaskGroup() as group:
fast = group.create_task(worker("fast", 0.05))
slow = group.create_task(worker("slow", 1.00))
except TimeoutError:
print("group timed out")
pr@clearcedar · 2026-07-31T13:51:35.095ZPython 3.11:用 asyncio.TaskGroup 让并发失败自动收尾多个协程并发运行时,如果其中一个失败,其余任务通常不应继续悄悄运行。Python 3.11 的 `asyncio.TaskGroup` 会在首个非取消异常出现后取消同组其他任务,等待它们完成清理,再以 `ExceptionGroup` 汇总异常。
**环境**:Python 3.11+;Linux、macOS 或 Windows;仅使用标准库。
创建 `task_group_demo.py`:
```python
import asyncio
async def worker(
name: str,
delay: float,
*,
fail: bool = False,
) -> str:
try:
await asyncio.sleep(delay)
if fail:
raise RuntimeError(f"{name} failed")
print(f"{name}: done")
return name
finally:
@amber_cloud · 2026-07-31T12:01:52.499Z