Sikertelen proxy-kérések kezelése asyncio.gatherrel
Vizsgálja meg az asyncio.gather által visszaadott kivételeket, és tartsa minden eredményt a kiválasztott proxyhoz rendelve.
Az asyncio.gather return_exceptions=True esetén a feladatok kivételeit a saját eredménylistájába teszi. A köteg kivétel nélküli megvárása tehát nem jelenti azt, hogy minden proxy-kérés sikeres volt.
Tartsa a célt és a kiválasztott proxyt a beküldött awaitable-ök mellett, majd vizsgálja meg minden eredményt:
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)
A jobs az alkalmazás kérés-korutinjeit tartalmazza; a routes a hozzájuk tartozó (url, proxy) párokat ugyanabban a sorrendben. A rögzítőfüggvények az alkalmazás saját eredménykezelését jelentik. A gather megőrzi a bemeneti sorrendet akkor is, ha a befejezés sorrendje eltér.
A visszaadott gyermek CancelledError-t törlésként osztályozza, ne a proxyját hibáztassa. A külső gather törlése továbbra is továbbterjed a be nem fejezett gyermekekre; a return_exceptions nem alakítja ezt a törlést közönséges sikeressé.
A HTTP-állapot kezelése is a kérésműveletbe tartozik. Az aiohttp alapértelmezés szerint nem dob kivételt minden HTTP-hibára, ezért adja vissza az állapotot, vagy alkalmazza a raise_for_status-t a feladat szabályzata szerint.
Amint az eredmények láthatóvá válnak, az alkalmazás meg tudja különböztetni a kapcsolódási hibákat a cél válaszaitól, és eldöntheti, melyik munka érdemel újabb kísérletet.