Hantera misslyckade proxyförfrågningar med asyncio.gather
Undersök undantagen som asyncio.gather returnerar och håll varje resultat kopplat till den valda proxyn.
asyncio.gather med return_exceptions=True lägger uppgifternas undantag i sin resultatlista. Att vänta på batchen utan undantag betyder därför inte att varje proxyförfrågan lyckades.
Håll destinationen och den valda proxyn bredvid de skickade awaitables och undersök sedan varje resultat:
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 innehåller applikationens förfrågningskorutiner; routes innehåller deras motsvarande (url, proxy)-par i samma ordning. Registreringsfunktionerna är applikationens egen resultathantering. gather bevarar indataordningen även när slutförandeordningen skiljer sig.
Klassificera en returnerad CancelledError från en barnuppgift som avbrott i stället för att skylla på dess proxy. Avbrott av den yttre gather fortplantar sig fortfarande till ofullbordade barn; return_exceptions gör inte det avbrottet till vanlig framgång.
Hantering av HTTP-status hör också inuti förfrågningsoperationen. aiohttp kastar inte undantag för varje HTTP-fel som standard, så returnera statusen eller använd raise_for_status enligt uppgiftens policy.
När resultaten är synliga kan applikationen skilja anslutningsfel från destinationens svar och avgöra vilket arbete som förtjänar ett nytt försök.