Xử lý các yêu cầu proxy thất bại bằng asyncio.gather
Kiểm tra các ngoại lệ do asyncio.gather trả về và giữ mỗi kết quả gắn với proxy đã chọn.
asyncio.gather với return_exceptions=True đặt ngoại lệ của các tác vụ vào danh sách kết quả của nó. Vì vậy, việc chờ cả lô mà không có ngoại lệ không có nghĩa là mọi yêu cầu proxy đều thành công.
Giữ đích đến và proxy đã chọn bên cạnh các awaitable đã gửi, rồi kiểm tra từng kết quả:
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 chứa các coroutine yêu cầu của ứng dụng; routes chứa các cặp (url, proxy) tương ứng theo cùng thứ tự. Các hàm ghi nhận là phần xử lý kết quả của chính ứng dụng. gather giữ nguyên thứ tự đầu vào ngay cả khi thứ tự hoàn thành khác đi.
Hãy phân loại CancelledError do một tác vụ con trả về là hủy bỏ thay vì đổ lỗi cho proxy của nó. Việc hủy gather bên ngoài vẫn lan sang các tác vụ con chưa hoàn tất; return_exceptions không biến việc hủy đó thành thành công thông thường.
Việc xử lý mã trạng thái HTTP cũng nằm trong thao tác yêu cầu. aiohttp mặc định không ném ngoại lệ cho mọi lỗi HTTP, nên hãy trả về mã trạng thái hoặc áp dụng raise_for_status theo chính sách của tác vụ.
Khi kết quả đã hiện rõ, ứng dụng có thể phân biệt lỗi kết nối với phản hồi từ đích đến và quyết định công việc nào đáng thử lại.