Epäonnistuneiden proxy-pyyntöjen käsittely asyncio.gatherilla
Tarkastele asyncio.gatherin palauttamia poikkeuksia ja pidä jokainen tulos valitun proxyn yhteydessä.
asyncio.gather yhdessä return_exceptions=True:n kanssa sijoittaa tehtävien poikkeukset tuloslistaansa. Siksi erän odottaminen ilman poikkeusta ei tarkoita, että jokainen proxy-pyyntö onnistui.
Pidä kohde ja valittu proxy lähetettyjen awaitable-olioiden rinnalla ja tarkastele sitten jokaista tulosta:
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 sisältää sovelluksen pyyntökorutiinit; routes sisältää niitä vastaavat (url, proxy) -parit samassa järjestyksessä. Tallennusfunktiot ovat sovelluksen omaa tulosten käsittelyä. gather säilyttää syötejärjestyksen, vaikka valmistumisjärjestys poikkeaisi.
Luokittele lapsitehtävän palauttama CancelledError peruutukseksi sen proxya syyttämättä. Ulomman gatherin peruutus etenee silti keskeneräisiin lapsiin; return_exceptions ei muuta sitä peruutusta tavalliseksi onnistumiseksi.
Myös HTTP-tilan käsittely kuuluu pyyntöoperaation sisään. aiohttp ei oletuksena nosta poikkeusta jokaisesta HTTP-virheestä, joten palauta tila tai käytä raise_for_status-toimintoa tehtävän käytännön mukaan.
Kun tulokset ovat näkyvissä, sovellus voi erottaa yhteysvirheet kohteen vastauksista ja päättää, mikä työ ansaitsee uuden yrityksen.