asyncio.gather met return_exceptions=True plaatst de uitzonderingen van taken in zijn resultatenlijst. Wachten op de batch zonder uitzondering betekent dus niet dat elk proxyverzoek is geslaagd.

Houd de bestemming en de gekozen proxy naast de ingediende awaitables en inspecteer daarna elk resultaat:

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 bevat de verzoekcoroutines van de applicatie; routes bevat de bijbehorende (url, proxy)-paren in dezelfde volgorde. De registratiefuncties zijn de eigen resultaatverwerking van de applicatie. gather behoudt de invoervolgorde, ook wanneer de voltooiingsvolgorde anders is.

Classificeer een teruggegeven CancelledError van een kindtaak als annulering in plaats van de proxy de schuld te geven. Annulering van de buitenste gather plant zich nog steeds voort naar onvoltooide kinderen; return_exceptions maakt die annulering niet tot gewoon succes.

Afhandeling van de HTTP-status hoort ook binnen de verzoekbewerking. aiohttp gooit standaard geen uitzondering voor elke HTTP-fout, dus retourneer de status of pas raise_for_status toe volgens het beleid van de taak.

Zodra de resultaten zichtbaar zijn, kan de applicatie verbindingsfouten onderscheiden van reacties van de bestemming en beslissen welk werk een nieuwe poging verdient.

Gerelateerde artikelen