טיפול בבקשות פרוקסי שנכשלו עם 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 לפי המדיניות של המשימה.
לאחר שהתוצאות גלויות, היישום יכול להבחין בין כשלי חיבור לתגובות היעד ולהחליט איזו עבודה ראויה לניסיון נוסף.