asyncio.gather amb return_exceptions=True posa les excepcions de les tasques a la seva llista de resultats. Per tant, esperar el lot sense cap excepció no vol dir que totes les sol·licituds de proxy hagin tingut èxit.

Manteniu la destinació i el proxy triat al costat dels awaitables enviats i, després, inspeccioneu cada resultat:

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 conté les corutines de sol·licitud de l'aplicació; routes conté els seus parells (url, proxy) corresponents en el mateix ordre. Les funcions de registre són el tractament de resultats propi de l'aplicació. gather conserva l'ordre d'entrada encara que l'ordre de finalització sigui diferent.

Classifiqueu un CancelledError retornat d'una tasca filla com a cancel·lació en lloc de culpar el seu proxy. La cancel·lació del gather exterior encara es propaga a les filles inacabades; return_exceptions no converteix aquesta cancel·lació en un èxit ordinari.

El tractament de l'estat HTTP també pertany dins de l'operació de sol·licitud. aiohttp no llança una excepció per a cada error HTTP per defecte, així que retorneu l'estat o apliqueu raise_for_status segons la política de la tasca.

Un cop els resultats són visibles, l'aplicació pot distingir les fallades de connexió de les respostes de destinació i decidir quina feina mereix un altre intent.

Articles relacionats