asyncio.gather s return_exceptions=True stavlja iznimke zadataka na svoj popis rezultata. Stoga čekanje na seriju bez iznimke 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 bilježenja vlastita su obrada rezultata aplikacije. gather čuva redoslijed unosa čak i kada se redoslijed dovrš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 nedovrš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 iznimku za svaku HTTP pogrešku, pa vratite status ili primijenite raise_for_status u skladu s politikom zadatka.

Kad 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