Ebaõnnestunud puhverserveri päringute käsitlemine asyncio.gather abil
Uurige asyncio.gather tagastatavaid erandeid ja hoidke iga tulemus seotud valitud puhverserveriga.
asyncio.gather koos return_exceptions=True paneb ülesannete erandid oma tulemuste loendisse. Seega ei tähenda partii ootamine ilma erandita, et iga puhverserveri päring õnnestus.
Hoidke sihtkoht ja valitud puhverserver saadetud awaitable-objektide kõrval ning seejärel uurige iga tulemust:
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 sisaldab rakenduse päringu korutiine; routes sisaldab nende vastavaid (url, proxy) paare samas järjekorras. Salvestusfunktsioonid on rakenduse enda tulemuste töötlemine. gather säilitab sisendjärjekorra ka siis, kui lõpetamise järjekord erineb.
Klassifitseerige alamtöölt tagastatud CancelledError tühistamiseks, selle puhverserverit süüdistamata. Välimise gather tühistamine levib endiselt lõpetamata lastele; return_exceptions ei muuda seda tühistamist tavaliseks õnnestumiseks.
Ka HTTP-oleku käsitlemine kuulub päringuoperatsiooni sisse. aiohttp ei viska vaikimisi iga HTTP-vea korral erandit, seega tagastage olek või rakendage vastavalt ülesande põhimõttele raise_for_status.
Kui tulemused on nähtavad, saab rakendus eristada ühenduse tõrkeid sihtkoha vastustest ja otsustada, milline töö väärib veel ühte katset.