asyncio.gather со return_exceptions=True ги става исклучоците на задачите во својата листа со резултати. Затоа чекањето на серијата без исклучок не значи дека секое proxy барање успеало.

Држете ја дестинацијата и избраниот proxy до испратените awaitable објекти, потоа прегледајте го секој резултат:

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 ги содржи корутините за барања на апликацијата; routes ги содржи соодветните парови (url, proxy) во истиот редослед. Функциите за запишување се сопствена обработка на резултати на апликацијата. gather го зачувува редоследот на влезот дури и кога редоследот на завршување е различен.

Класифицирајте го вратениот CancelledError на детска задача како откажување наместо да го обвинувате нејзиниот proxy. Откажувањето на надворешниот gather сè уште се шири на незавршените деца; return_exceptions не го претвора тоа откажување во обичен успех.

Обработката на HTTP статусот исто така припаѓа внатре во операцијата за барање. aiohttp стандардно не фрла исклучок за секоја HTTP грешка, затоа вратете го статусот или применете raise_for_status според политиката на задачата.

Откако резултатите ќе станат видливи, апликацијата може да ги разликува мрежните дефекти од одговорите на дестинацијата и да одлучи кое работење заслужува уште еден обид.

Поврзани статии