Չհաջողված պրոքսի հարցումների կառավարում 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-ը՝ ըստ առաջադրանքի քաղաքականության։
Երբ արդյունքները տեսանելի են, հավելվածը կարող է տարբերել միացման խափանումները նպատակակետի պատասխաններից և որոշել, թե որ աշխատանքն է արժանի ևս մեկ փորձի։