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 ตามนโยบายของงาน

เมื่อเห็นผลลัพธ์แล้ว แอปพลิเคชันสามารถแยกความล้มเหลวของการเชื่อมต่อออกจากการตอบกลับของปลายทาง และตัดสินว่างานใดสมควรได้รับการลองอีกครั้ง

บทความที่เกี่ยวข้อง