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.

Aiheeseen liittyvät artikkelit