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.

Erthyglau cysylltiedig