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.

Povezani članci