จัดการคำขอพร็อกซีที่ล้มเหลวด้วย 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 ตามนโยบายของงาน
เมื่อเห็นผลลัพธ์แล้ว แอปพลิเคชันสามารถแยกความล้มเหลวของการเชื่อมต่อออกจากการตอบกลับของปลายทาง และตัดสินว่างานใดสมควรได้รับการลองอีกครั้ง