Inilalagay ng asyncio.gather na may return_exceptions=True ang mga eksepsiyon ng gawain sa listahan ng resulta nito. Kaya ang paghihintay sa batch nang walang eksepsiyon ay hindi nangangahulugang nagtagumpay ang bawat kahilingan sa proxy.

Panatilihin ang destinasyon at ang napiling proxy sa tabi ng mga isinumiteng awaitable, pagkatapos ay suriin ang bawat resulta:

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)

Naglalaman ang jobs ng mga coroutine ng kahilingan ng aplikasyon; naglalaman ang routes ng mga katumbas na pares (url, proxy) sa parehong pagkakasunod-sunod. Ang mga function ng pagtatala ay ang sariling paghawak ng resulta ng aplikasyon. Pinapanatili ng gather ang pagkakasunod-sunod ng input kahit magkaiba ang pagkakasunod-sunod ng pagtatapos.

Uriin ang ibinalik na CancelledError mula sa child task bilang pagkansela sa halip na sisihin ang proxy nito. Lumalaganap pa rin ang pagkansela ng panlabas na gather sa mga hindi pa tapos na anak; hindi ginagawang ordinaryong tagumpay ng return_exceptions ang pagkanselang iyon.

Ang paghawak ng HTTP status ay kabilang din sa loob ng operasyon ng kahilingan. Hindi nagtataas ang aiohttp ng eksepsiyon para sa bawat error sa HTTP bilang default, kaya ibalik ang status o gamitin ang raise_for_status ayon sa patakaran ng gawain.

Kapag nakikita na ang mga resulta, maaaring ihiwalay ng aplikasyon ang mga pagkabigo sa koneksiyon mula sa mga tugon ng destinasyon at magpasya kung aling gawain ang karapat-dapat sa isa pang pagtatangka.

Kaugnay na mga artikulo