Håndtering af mislykkede proxy-anmodninger med asyncio.gather
Undersøg de undtagelser, som asyncio.gather returnerer, og hold hvert resultat knyttet til den valgte proxy.
asyncio.gather med return_exceptions=True lægger opgavernes undtagelser i sin resultatliste. At afvente batchen uden en undtagelse betyder derfor ikke, at hver proxy-anmodning lykkedes.
Hold destinationen og den valgte proxy sammen med de indsendte awaitables, og undersøg derefter hvert resultat:
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 indeholder applikationens anmodningskorutiner; routes indeholder deres tilsvarende (url, proxy)-par i samme rækkefølge. Registreringsfunktionerne er applikationens egen resultatbehandling. gather bevarer inputrækkefølgen, selv når færdiggørelsesrækkefølgen er anderledes.
Klassificér en returneret CancelledError fra en underordnet opgave som annullering i stedet for at bebrejde dens proxy. Annullering af den ydre gather forplanter sig stadig til uafsluttede børn; return_exceptions gør ikke den annullering til almindelig succes.
Håndtering af HTTP-status hører også inden i anmodningsoperationen. aiohttp rejser ikke undtagelse for hver HTTP-fejl som standard, så returnér status, eller anvend raise_for_status efter opgavens politik.
Når resultaterne er synlige, kan applikationen skelne forbindelsesfejl fra destinationssvar og beslutte, hvilket arbejde der fortjener endnu et forsøg.