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.

Relaterede artikler