Zpracování neúspěšných proxy požadavků pomocí asyncio.gather
Prohlédněte si výjimky, které vrací asyncio.gather, a každý výsledek spojte s vybraným proxy.
asyncio.gather s return_exceptions=True ukládá výjimky úloh do seznamu výsledků. Čekání na dávku bez výjimky tedy neznamená, že každý proxy požadavek uspěl.
Uchovejte cíl a zvolený proxy vedle odeslaných awaitable objektů a poté prohlédněte každý výsledek:
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žadavků aplikace; routes obsahuje jejich odpovídající dvojice (url, proxy) ve stejném pořadí. Záznamové funkce představují vlastní zpracování výsledků aplikace. gather zachovává vstupní pořadí, i když se pořadí dokončení liší.
Vrácený CancelledError podřízené úlohy klasifikujte jako zrušení, místo abyste obviňovali její proxy. Zrušení vnějšího gather se stále šíří do nedokončených potomků; return_exceptions toto zrušení nepřevádí na běžný úspěch.
Zpracování stavu HTTP patří také dovnitř operace požadavku. aiohttp ve výchozím nastavení nevyvolává výjimku pro každou chybu HTTP, proto stav vraťte nebo použijte raise_for_status podle zásad úlohy.
Jakmile jsou výsledky viditelné, aplikace může rozlišit selhání připojení od odpovědí cíle a rozhodnout, která práce si zaslouží další pokus.