asyncio.gather s return_exceptions=True ukladá výnimky úloh do svojho zoznamu výsledkov. Čakanie na dávku bez výnimky teda neznamená, že každá proxy požiadavka uspela.

Uchovajte cieľ a zvolený proxy vedľa odoslaných awaitable objektov a potom prezrite každý výsledok:

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 obsahuje korutiny požiadaviek aplikácie; routes obsahuje ich zodpovedajúce dvojice (url, proxy) v rovnakom poradí. Záznamové funkcie predstavujú vlastné spracovanie výsledkov aplikácie. gather zachováva vstupné poradie, aj keď sa poradie dokončenia líši.

Vrátený CancelledError podradenej úlohy klasifikujte ako zrušenie, namiesto obviňovania jej proxy. Zrušenie vonkajšieho gather sa stále šíri do nedokončených potomkov; return_exceptions toto zrušenie nepremieňa na bežný úspech.

Spracovanie stavu HTTP patrí tiež dovnútra operácie požiadavky. aiohttp predvolene nevyvoláva výnimku pri každej chybe HTTP, preto stav vráťte alebo použite raise_for_status podľa zásad úlohy.

Keď sú výsledky viditeľné, aplikácia môže rozlíšiť zlyhania pripojenia od odpovedí cieľa a rozhodnúť, ktorá práca si zaslúži ďalší pokus.

Súvisiace články