기술 · 실용 가이드
asyncio.gather가 예외를 냈는데 형제 Task가 계속되나요? TaskGroup 또는 소유 취소를 선택하세요
gather는 첫 예외를 전달하지만 형제를 취소하지 않습니다. 함께 실패하려면TaskGroup, 선택 정책이면Task를 보유해 취소하고 정리를 기다리세요.

asyncio.gather는 결과 집계이지 함께 실패하는 범위가 아닙니다. 첫 예외가 호출자에게 전파돼도 미완료 형제는 예약 상태입니다. gather Future가 완료됐으면cancel은false입니다.
예약 전에 실패 정책을 정하세요. 하나의 일관성 경계면Python 3.11+ TaskGroup을 사용하고, 일부만 중지하려면Task를 직접 소유해 취소하고 정리를 기다립니다.
1. 실패 후 작업 생존을 재현
빠르게 실패하는 코루틴과 늦게 표식을 남기는 코루틴을gather합니다. 예외 후cancel하고 루프를 유지해false와 표식을 확인합니다.
CPython 3.12.14에서는 느린 형제가 완료됐고TaskGroup에서는 취소됐습니다.
2. API보다 실패 정책을 먼저 선택
한 논리 결과를 함께 갱신하고 하나의 실패가 나머지를 무효화하면TaskGroup으로 함께 실패합니다.
독립 작업이나 복구 가능한 오류면Task 소유권을 유지합니다.
3. Python 3.11+에서는TaskGroup
같은TaskGroup으로 모든 형제를 만듭니다. 첫 비취소 예외가 나머지를 취소하고 정리를 기다립니다.
async with 밖에서except*로ExceptionGroup을 처리하고CancelledError를 삼키지 마세요.
4. 선택 정책은 소유, 취소, 대기, 재발생
create_task로 핸들을 보유하고 정책 대상만cancel합니다. return_exceptions=True로 모든 소유Task를 기다립니다.
그 후 원래 오류를 다시 올리거나 결과를 명시합니다.
5. 협력 취소 검수
CancelledError는await 지점에서 들어옵니다. try/finally로 정리하고 보통 다시 올립니다.
gather 지속,TaskGroup 취소, 수동 대기, 부모 취소와 부작용 로그를 확인하세요.
