asyncio.gather з return_exceptions=True змяшчае выключэнні задач у свой спіс вынікаў. Таму чаканне пакета без выключэння не азначае, што ўсе запыты праз проксі паспяховыя.

Трымайце прызначэнне і выбраны проксі побач з адпраўленымі 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 даччынай задачы як скасаванне, а не вінавацьце яго проксі. Скасаванне знешняга gather па-ранейшаму перадаецца незавершаным даччыным задачам; return_exceptions не ператварае гэта скасаванне ў звычайны поспех.

Апрацоўка HTTP-статусу таксама павінна знаходзіцца ўнутры аперацыі запыту. aiohttp па змаўчанні не ўздымае выключэнне для кожнай HTTP-памылкі, таму вяртайце статус або ўжывайце raise_for_status згодна з палітыкай задачы.

Калі вынікі бачныя, праграма можа адрозніваць збоі злучэння ад адказаў прызначэння і вырашаць, якая праца заслугоўвае паўторнай спробы.

Падобныя артыкулы