asyncio.gather su return_exceptions=True į savo rezultatų sąrašą įdeda užduočių išimtis. Todėl laukimas partijos be išimties nereiškia, kad kiekviena proxy užklausa pavyko.

Laikykite paskirties vietą ir pasirinktą proxy šalia pateiktų awaitable objektų, tada patikrinkite kiekvieną 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 saugo programos užklausų korutinas; routes saugo atitinkamas (url, proxy) poras ta pačia tvarka. Įrašymo funkcijos yra pačios programos rezultatų apdorojimas. gather išlaiko įvesties tvarką, net kai užbaigimo tvarka skiriasi.

Grąžintą vaikinės užduoties CancelledError klasifikuokite kaip atšaukimą, o ne kaltinkite jos proxy. Išorinio gather atšaukimas vis tiek plinta nepabaigtiems vaikams; return_exceptions nepaverčia to atšaukimo įprasta sėkme.

HTTP būsenos apdorojimas taip pat priklauso užklausos operacijai. aiohttp pagal numatytuosius nustatymus neiškelia išimties dėl kiekvienos HTTP klaidos, todėl grąžinkite būseną arba taikykite raise_for_status pagal užduoties politiką.

Kai rezultatai matomi, programa gali atskirti ryšio sutrikimus nuo paskirties vietos atsakymų ir nuspręsti, kuris darbas vertas dar vieno bandymo.

Susiję straipsniai