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.

Ähnliche Artikel