Lidar com pedidos de proxy falhados com asyncio.gather
Inspecione as exceções devolvidas por asyncio.gather e mantenha cada resultado associado ao proxy selecionado.
asyncio.gather com return_exceptions=True coloca as exceções das tarefas na sua lista de resultados. Portanto, aguardar o lote sem exceção não significa que todos os pedidos de proxy tenham sido bem-sucedidos.
Mantenha o destino e o proxy escolhido junto dos awaitables submetidos e, em seguida, inspecione 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ém as corrotinas de pedido da aplicação; routes contém os respetivos pares (url, proxy) na mesma ordem. As funções de registo são o tratamento de resultados da própria aplicação. gather preserva a ordem de entrada mesmo quando a ordem de conclusão é diferente.
Classifique um CancelledError devolvido por uma tarefa filha como cancelamento em vez de culpar o seu proxy. O cancelamento do gather externo continua a propagar-se às filhas inacabadas; return_exceptions não transforma esse cancelamento num sucesso comum.
O tratamento do estado HTTP também pertence à operação de pedido. aiohttp não lança exceção para todos os erros HTTP por predefinição, por isso devolva o estado ou aplique raise_for_status conforme a política da tarefa.
Assim que os resultados estiverem visíveis, a aplicação pode distinguir falhas de ligação de respostas do destino e decidir que trabalho merece outra tentativa.