Obrada neuspjelih proxy zahtjeva pomoću asyncio.gather
Pregledajte izuzetke koje vraća asyncio.gather i zadržite svaki ishod povezan s odabranim proxyjem.
asyncio.gather s return_exceptions=True stavlja izuzetke zadataka na svoju listu rezultata. Zato čekanje na seriju bez izuzetka ne znači da je svaki proxy zahtjev uspio.
Držite odredište i odabrani proxy uz poslane awaitable objekte, a zatim pregledajte svaki ishod:
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 sadrži korutine zahtjeva aplikacije; routes sadrži njihove odgovarajuće (url, proxy) parove istim redoslijedom. Funkcije za bilježenje predstavljaju vlastitu obradu rezultata aplikacije. gather čuva redoslijed unosa čak i kada se redoslijed završetka razlikuje.
Vraćeni CancelledError podređenog zadatka klasificirajte kao otkazivanje, umjesto da krivite njegov proxy. Otkazivanje vanjskog gather-a i dalje se prenosi na nezavršenu djecu; return_exceptions ne pretvara to otkazivanje u običan uspjeh.
Obrada HTTP statusa također pripada unutar operacije zahtjeva. aiohttp prema zadanim postavkama ne podiže izuzetak za svaku HTTP grešku, pa vratite status ili primijenite raise_for_status u skladu s politikom zadatka.
Kada ishodi postanu vidljivi, aplikacija može razlikovati mrežne kvarove od odgovora odredišta i odlučiti koji posao zaslužuje još jedan pokušaj.