Delio â cheisiadau procsi sy'n methu gydag asyncio.gather
Archwiliwch yr eithriadau a ddychwelir gan asyncio.gather a chadwch bob canlyniad yn gysylltiedig â'r procsi a ddewiswyd.
Mae asyncio.gather gyda return_exceptions=True yn rhoi eithriadau tasgau yn ei restr ganlyniadau. Felly nid yw aros am y swp heb eithriad yn golygu bod pob cais procsi wedi llwyddo.
Cadwch y gyrchfan a'r procsi a ddewiswyd ochr yn ochr â'r awaitables a gyflwynwyd, yna archwiliwch bob canlyniad:
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)
Mae jobs yn cynnwys corwtinau ceisiadau'r rhaglen; mae routes yn cynnwys eu parau (url, proxy) cyfatebol yn yr un drefn. Y ffwythiannau cofnodi yw triniaeth ganlyniadau'r rhaglen ei hun. Mae gather yn cadw trefn y mewnbwn hyd yn oed pan fo trefn y cwblhau'n wahanol.
Dosbarthwch CancelledError tasg plentyn a ddychwelwyd fel canslo yn hytrach na beio ei brocsi. Mae canslo'r gather allanol yn dal i ledaenu i blant heb eu gorffen; nid yw return_exceptions yn troi'r canslo hwnnw'n llwyddiant cyffredin.
Mae trin statws HTTP hefyd yn perthyn o fewn y llawdriniaeth gais. Nid yw aiohttp yn codi eithriad ar gyfer pob gwall HTTP yn ddiofyn, felly dychwelwch y statws neu gymhwyswch raise_for_status yn ôl polisi'r dasg.
Unwaith y bydd y canlyniadau'n weladwy, gall y rhaglen wahaniaethu rhwng methiannau cysylltiad ac ymatebion y gyrchfan a phenderfynu pa waith sy'n haeddu cynnig arall.