Апрацоўка няўдалых запытаў праз проксі з дапамогай asyncio.gather
Правярайце выключэнні, якія вяртае asyncio.gather, і звязвайце кожны вынік з выбраным проксі.
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 згодна з палітыкай задачы.
Калі вынікі бачныя, праграма можа адрозніваць збоі злучэння ад адказаў прызначэння і вырашаць, якая праца заслугоўвае паўторнай спробы.