Gestire le richieste proxy fallite con asyncio.gather
Esaminate le eccezioni restituite da asyncio.gather e mantenete ogni esito associato al proxy selezionato.
asyncio.gather con return_exceptions=True inserisce le eccezioni dei task nel proprio elenco di risultati. Attendere il lotto senza eccezioni non significa quindi che ogni richiesta proxy sia riuscita.
Tenete la destinazione e il proxy scelto accanto agli awaitable inviati, poi esaminate ogni esito:
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 contiene le coroutine di richiesta dell'applicazione; routes contiene le relative coppie (url, proxy) nello stesso ordine. Le funzioni di registrazione sono la gestione dei risultati dell'applicazione stessa. gather conserva l'ordine di input anche quando l'ordine di completamento è diverso.
Classificate un CancelledError restituito da un task figlio come annullamento invece di incolpare il suo proxy. L'annullamento del gather esterno si propaga comunque ai figli non completati; return_exceptions non trasforma quell'annullamento in un successo ordinario.
Anche la gestione dello stato HTTP appartiene all'operazione di richiesta. aiohttp non solleva un'eccezione per ogni errore HTTP per impostazione predefinita, quindi restituite lo stato o applicate raise_for_status secondo la politica del task.
Una volta visibili gli esiti, l'applicazione può distinguere i guasti di connessione dalle risposte della destinazione e decidere quale lavoro merita un altro tentativo.