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.

Kapcsolódó cikkek