작은 Python 애플리케이션이 측정값과 가중치를 동시에 가져온 뒤 하나의 점수로 합친다고 해 봐요. 한쪽에서 예외가 발생했는데 다른 쪽은 아직 실행 중이에요. 언어마다 동시 실행을 어떻게 표현하는지 비교하기 전에, 이 계산에 어떤 실행 흐름이 필요한지 먼저 정하면 어떨까요?
저라면 한쪽의 실패로 전체 계산이 불가능해지는지부터 판단하겠어요. asyncio.TaskGroup에서는 구성원 하나가 CancelledError 이외의 예외로 실패하면 나머지 구성원을 취소하고, 그룹을 벗어나는 처리가 끝나기 전에 소속 작업들을 기다려요. 코루틴 함수를 호출하는 것만으로는 작업이 스케줄되지 않아요. 가져오기 작업들을 그룹 안의 태스크로 만들어야 해요.
그다음에는 별도의 준비 상태 판단이 있어요. 두 태스크가 정상적으로 반환해도 가중치가 적합하지 않다면, 수집이 끝났다는 사실만으로 계산을 시작해도 된다고 할 수는 없어요. 입력을 거부할지, 새 값을 요청할지, 부분 결과를 만들지는 애플리케이션이 정해야 해요. TaskGroup이 그 정책까지 선택해 주지는 않아요.
호출한 쪽의 취소를 어떻게 처리할지도 살펴보겠어요. 가져오기 작업의 정리 과정에서 CancelledError를 다시 전달해 취소가 유지되는지도 확인해야 해요. 이를 삼켜 버리면 그룹의 취소 동작이 어긋날 수 있어요.
이 애플리케이션에서는 어느 한쪽의 실패로 결합 요청을 끝내야 하고, 해당 범위를 벗어나기 전에 소속 작업들을 기다려야 한다면 TaskGroup을 고르겠어요. 그리고 계산 전에 반환된 데이터를 검증하겠어요. 이런 요구사항이 있어야 언어를 비교할 때도 무엇을 유지해야 하는지 구체적으로 알 수 있어요.
