Håndtere mislykkede proxy-forespørsler med asyncio.gather
Undersøk unntakene som asyncio.gather returnerer, og hold hvert resultat knyttet til den valgte proxyen.
asyncio.gather med return_exceptions=True legger oppgavenes unntak i resultatlisten sin. Å vente på batchen uten unntak betyr derfor ikke at hver proxy-forespørsel lyktes.
Hold destinasjonen og den valgte proxyen sammen med awaitable-objektene som ble sendt, og undersøk deretter 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 inneholder applikasjonens forespørselskorutiner; routes inneholder de tilsvarende (url, proxy)-parene i samme rekkefølge. Registreringsfunksjonene er applikasjonens egen resultatbehandling. gather bevarer inndata-rekkefølgen selv når fullføringsrekkefølgen er annerledes.
Klassifiser en returnert CancelledError fra en underoppgave som avbrudd i stedet for å klandre proxyen dens. Avbrudd av den ytre gather forplanter seg fortsatt til uferdige barn; return_exceptions gjør ikke det avbruddet til vanlig suksess.
Håndtering av HTTP-status hører også inni forespørselsoperasjonen. aiohttp kaster ikke unntak for hver HTTP-feil som standard, så returner statusen eller bruk raise_for_status etter oppgavens policy.
Når resultatene er synlige, kan applikasjonen skille tilkoblingsfeil fra destinasjonens svar og avgjøre hvilket arbeid som fortjener et nytt forsøk.