Xestionar as solicitudes de proxy fallidas con asyncio.gather
Inspeccione as excepcións que devolve asyncio.gather e manteña cada resultado asociado ao proxy seleccionado.
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.