asyncio.gather са return_exceptions=True ставља изузетке задатака на своју листу резултата. Зато чекање на серију без изузетка не значи да је сваки proxy захтев успео.

Држите одредиште и изабрани proxy уз послате 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 подређеног задатка класификујте као отказивање, уместо да кривите његов proxy. Отказивање спољашњег gather-а и даље се преноси на незавршену децу; return_exceptions не претвара то отказивање у обичан успех.

Обрада HTTP статуса такође припада унутар операције захтева. aiohttp подразумевано не подиже изузетак за сваку HTTP грешку, па вратите статус или примените raise_for_status у складу с политиком задатка.

Када исходи постану видљиви, апликација може разликовати мрежне кварове од одговора одредишта и одлучити који посао заслужује још један покушај.

Повезани чланци