Obvladovanje neuspešnih proxy zahtevkov z asyncio.gather
Preglejte izjeme, ki jih vrne asyncio.gather, in vsak rezultat ohranite povezan z izbranim proxyjem.
asyncio.gather z return_exceptions=True postavi izjeme opravil na svoj seznam rezultatov. Čakanje na paket brez izjeme torej ne pomeni, da je vsak proxy zahtevek uspel.
Obdržite cilj in izbrani proxy ob poslanih awaitable objektih, nato preglejte vsak rezultat:
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 vsebuje korutine zahtevkov aplikacije; routes vsebuje njihove ustrezne pare (url, proxy) v enakem vrstnem redu. Funkcije za zapisovanje so lastna obdelava rezultatov aplikacije. gather ohrani vrstni red vhoda tudi, ko se vrstni red dokončanja razlikuje.
Vrnjeni CancelledError podrejenega opravila razvrstite kot preklic, namesto da bi krivili njegov proxy. Preklic zunanjega gather se še vedno širi na nedokončane otroke; return_exceptions tega preklica ne spremeni v običajen uspeh.
Tudi obdelava stanja HTTP sodi znotraj operacije zahtevka. aiohttp privzeto ne sproži izjeme pri vsaki napaki HTTP, zato vrnite stanje ali uporabite raise_for_status v skladu s politiko opravila.
Ko so rezultati vidni, lahko aplikacija loči napake povezave od odgovorov cilja in se odloči, katero delo si zasluži še en poskus.