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.

Artigos relacionados