Fehlgeschlagene Proxy-Anfragen mit asyncio.gather behandeln
Untersuchen Sie die von asyncio.gather zurückgegebenen Ausnahmen und halten Sie jedes Ergebnis dem ausgewählten Proxy zugeordnet.
asyncio.gather legt mit return_exceptions=True die Ausnahmen der Tasks in seine Ergebnisliste. Das Warten auf den Stapel ohne Ausnahme bedeutet daher nicht, dass jede Proxy-Anfrage erfolgreich war.
Halten Sie das Ziel und den gewählten Proxy neben den übergebenen Awaitables und prüfen Sie dann jedes Ergebnis:
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 enthält die Anfrage-Coroutinen der Anwendung; routes enthält die zugehörigen (url, proxy)-Paare in derselben Reihenfolge. Die Aufzeichnungsfunktionen sind die eigene Ergebnisverarbeitung der Anwendung. gather behält die Eingabereihenfolge bei, auch wenn die Abschlussreihenfolge abweicht.
Stufen Sie einen zurückgegebenen CancelledError eines Kind-Tasks als Abbruch ein, statt seinen Proxy zu beschuldigen. Der Abbruch des äußeren gather wird weiterhin an unfertige Kinder weitergegeben; return_exceptions macht diesen Abbruch nicht zu einem gewöhnlichen Erfolg.
Auch die Behandlung des HTTP-Status gehört in die Anfrageoperation. aiohttp löst standardmäßig nicht bei jedem HTTP-Fehler eine Ausnahme aus, daher geben Sie den Status zurück oder wenden Sie raise_for_status gemäß der Richtlinie des Tasks an.
Sobald die Ergebnisse sichtbar sind, kann die Anwendung Verbindungsfehler von Antworten des Ziels unterscheiden und entscheiden, welche Arbeit einen weiteren Versuch verdient.