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.

Relaterade artiklar