asyncio.gather로 실패한 프록시 요청 처리하기
asyncio.gather가 반환하는 예외를 검사하고 각 결과를 선택한 프록시와 계속 연결해 두세요.
asyncio.gather는 return_exceptions=True를 사용하면 작업의 예외를 결과 목록에 넣습니다. 따라서 예외 없이 배치를 기다렸다는 것이 모든 프록시 요청이 성공했다는 뜻은 아닙니다.
제출한 awaitable 옆에 목적지와 선택한 프록시를 함께 두고, 그다음 각 결과를 검사하세요:
outcomes = await asyncio.gather(*jobs, return_exceptions=True)
for (url, proxy), outcome in zip(routes, outcomes):
if isinstance(outcome, BaseException):
record_failure(url, proxy, outcome)
else:
record_success(url, proxy, outcome)
jobs에는 애플리케이션의 요청 코루틴이 들어 있고, routes에는 이에 대응하는 (url, proxy) 쌍이 같은 순서로 들어 있습니다. 기록 함수는 애플리케이션 자체의 결과 처리입니다. gather는 완료 순서가 달라도 입력 순서를 유지합니다.
하위 작업이 반환한 CancelledError는 그 프록시를 탓하지 말고 취소로 분류하세요. 바깥 gather의 취소는 여전히 끝나지 않은 하위 작업으로 전파됩니다. return_exceptions가 그 취소를 평범한 성공으로 바꾸지는 않습니다.
HTTP 상태 처리는 요청 작업 안에 있어야 합니다. aiohttp는 기본적으로 모든 HTTP 오류에 예외를 발생시키지 않으므로, 작업 정책에 따라 상태를 반환하거나 raise_for_status를 적용하세요.
결과가 드러나면 애플리케이션은 연결 실패와 목적지 응답을 구분하고 어떤 작업이 다시 시도할 가치가 있는지 결정할 수 있습니다.