Obsługa nieudanych żądań proxy za pomocą asyncio.gather
Sprawdź wyjątki zwracane przez asyncio.gather i utrzymuj każdy wynik powiązany z wybranym proxy.
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ę.