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 според политиката на задачата.

След като резултатите са видими, приложението може да различи мрежовите повреди от отговорите на дестинацията и да реши коя работа заслужава още един опит.

Подобни статии