asyncio.gather cu return_exceptions=True pune excepțiile sarcinilor în lista sa de rezultate. Așadar, așteptarea lotului fără excepție nu înseamnă că fiecare cerere proxy a reușit.

Păstrați destinația și proxy-ul ales lângă awaitable-urile trimise, apoi inspectați fiecare rezultat:

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 conține corutinele de cerere ale aplicației; routes conține perechile (url, proxy) corespunzătoare în aceeași ordine. Funcțiile de înregistrare sunt procesarea rezultatelor proprie aplicației. gather păstrează ordinea de intrare chiar și când ordinea de finalizare diferă.

Clasificați un CancelledError returnat de o sarcină copil ca anulare în loc să dați vina pe proxy-ul acesteia. Anularea gather-ului exterior se propagă în continuare la copiii neterminați; return_exceptions nu transformă acea anulare într-un succes obișnuit.

Gestionarea stării HTTP aparține de asemenea operației de cerere. aiohttp nu ridică o excepție pentru fiecare eroare HTTP în mod implicit, așa că returnați starea sau aplicați raise_for_status conform politicii sarcinii.

Odată ce rezultatele sunt vizibile, aplicația poate distinge eșecurile de conexiune de răspunsurile destinației și poate decide ce lucru merită o nouă încercare.

Articole similare