asyncio.gather met return_exceptions=True plaas die uitsonderings van take in sy resultaatlys. Om die bondel af te wag sonder dat 'n uitsondering opduik, beteken dus nie dat elke proxy-versoek geslaag het nie.

Hou die bestemming en die gekose proxy saam met die ingediende awaitables, en ondersoek dan elke uitkoms:

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 die toepassing se versoek-coroutines; routes bevat hul ooreenstemmende (url, proxy)-pare in dieselfde volgorde. Die opneemfunksies is die toepassing se eie hantering van resultate. gather behou die invoervolgorde selfs wanneer die voltooiingsvolgorde verskil.

Klassifiseer 'n teruggekeerde CancelledError van 'n kindtaak as kansellasie eerder as om die proxy daarvan te blameer. Kansellasie van die buitenste gather versprei steeds na onvoltooide kinders; return_exceptions maak nie daardie kansellasie tot gewone sukses nie.

Hantering van HTTP-status hoort ook binne die versoekbewerking. aiohttp veroorsaak nie by verstek 'n fout vir elke HTTP-fout nie, so gee die status terug of pas raise_for_status toe volgens die taak se beleid.

Sodra die uitkomste sigbaar is, kan die toepassing verbindingsfoute van bestemmingsresponse onderskei en besluit watter werk 'n verdere poging verdien.

Verwante artikels