언어별 동시성 비교는 보통 문법에서 시작하죠. 저는 뭔가 실패했을 때 이 계산에 무엇이 필요한지부터 보고 싶어요.
작은 Python 애플리케이션이 측정값과 가중치를 동시에 가져와서 하나의 점수로 합쳐요. 한쪽 가져오기가 예외를 던졌는데 다른 쪽은 아직 돌고 있어요.
첫 번째 단계예요. 가져오기 하나가 실패하면 계산 전체를 쓸 수 없게 되나요? 그렇다면 asyncio.TaskGroup이 맞아요. 멤버 하나가 CancelledError가 아닌 예외로 실패하면 그룹은 나머지 멤버를 취소하고, 종료를 마치기 전에 태스크들을 기다려요. 놓치기 쉬운 점이 하나 있어요. 코루틴 함수를 호출하기만 해서는 아무것도 예약되지 않으니, 가져오기를 그룹 안의 태스크로 만들어야 해요.
두 번째 단계는 다른 결정이에요. 두 태스크가 정상적으로 반환했는데 가중치가 쓸 만하지 않아요. 수집은 끝났어요. 이제 어떤 값이 왔는지 살펴봐요. 입력을 거부할지, 다시 요청할지, 부분 결과를 낼지는 TaskGroup이 정해 주지 않아요.
세 번째 단계는 호출자 쪽 취소예요. 가져오기의 정리 코드는 CancelledError를 그대로 전파해야 해요. 삼켜 버리면 그룹의 취소 동작이 흐트러질 수 있어요.
이 애플리케이션이라면 답은 TaskGroup이에요. 어느 쪽이 실패하든 합친 요청은 끝나야 하고, 스코프는 멤버들을 기다려야 하니까요. 반환된 데이터 검증은 그다음, 계산 전에 해요. 다른 언어와 비교할 때 지켜야 할 구체적인 기준이 바로 이거예요.
