asyncio.gather z return_exceptions=True umieszcza wyjątki zadań na swojej liście wyników. Oczekiwanie na partię bez wyjątku nie oznacza więc, że każde żądanie proxy się powiodło.

Trzymaj cel i wybrane proxy obok przesłanych awaitable, a następnie sprawdź każdy wynik:

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 zawiera korutyny żądań aplikacji; routes zawiera odpowiadające im pary (url, proxy) w tej samej kolejności. Funkcje zapisu to własna obsługa wyników aplikacji. gather zachowuje kolejność wejściową, nawet gdy kolejność ukończenia jest inna.

Zwrócony CancelledError zadania podrzędnego klasyfikuj jako anulowanie, a nie obwiniaj jego proxy. Anulowanie zewnętrznego gather nadal rozprzestrzenia się na nieukończone zadania podrzędne; return_exceptions nie zamienia tego anulowania w zwykły sukces.

Obsługa statusu HTTP również należy do operacji żądania. aiohttp domyślnie nie zgłasza wyjątku przy każdym błędzie HTTP, więc zwróć status lub zastosuj raise_for_status zgodnie z polityką zadania.

Gdy wyniki są widoczne, aplikacja może odróżnić awarie połączenia od odpowiedzi celu i zdecydować, która praca zasługuje na kolejną próbę.

Powiązane artykuły