asyncio.gather avec return_exceptions=True place les exceptions des tâches dans sa liste de résultats. Attendre le lot sans exception ne signifie donc pas que chaque requête proxy a réussi.

Gardez la destination et le proxy choisi à côté des awaitables soumis, puis inspectez chaque résultat :

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 contient les coroutines de requête de l'application ; routes contient leurs paires (url, proxy) correspondantes dans le même ordre. Les fonctions d'enregistrement constituent le traitement des résultats propre à l'application. gather conserve l'ordre d'entrée même lorsque l'ordre d'achèvement diffère.

Classez un CancelledError renvoyé par une tâche enfant comme une annulation plutôt que de blâmer son proxy. L'annulation du gather externe se propage toujours aux enfants inachevés ; return_exceptions ne transforme pas cette annulation en succès ordinaire.

Le traitement du statut HTTP appartient aussi à l'opération de requête. aiohttp ne lève pas d'exception pour chaque erreur HTTP par défaut, donc renvoyez le statut ou appliquez raise_for_status selon la politique de la tâche.

Une fois les résultats visibles, l'application peut distinguer les échecs de connexion des réponses de la destination et décider quel travail mérite une nouvelle tentative.

Articles similaires