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.

Relaterte artikler