asyncio.gather con return_exceptions=True coloca as excepcións das tarefas na súa lista de resultados. Polo tanto, agardar polo lote sen excepción non significa que todas as solicitudes de proxy tivesen éxito.

Manteña o destino e o proxy escollido xunto aos awaitables enviados e despois inspeccione cada resultado:

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én as corrutinas de solicitude da aplicación; routes contén os seus pares (url, proxy) correspondentes na mesma orde. As funcións de rexistro son o tratamento de resultados propio da aplicación. gather conserva a orde de entrada aínda que a orde de finalización sexa distinta.

Clasifique un CancelledError devolto por unha tarefa filla como cancelación en lugar de culpar o seu proxy. A cancelación do gather externo aínda se propaga ás fillas inacabadas; return_exceptions non converte esa cancelación nun éxito ordinario.

O tratamento do estado HTTP tamén pertence dentro da operación de solicitude. aiohttp non lanza unha excepción por cada erro HTTP por defecto, así que devolva o estado ou aplique raise_for_status segundo a política da tarefa.

Unha vez visibles os resultados, a aplicación pode distinguir os fallos de conexión das respostas do destino e decidir que traballo merece outro intento.

Artigos relacionados