Mae map pwll yn trosglwyddo un eitem i'r gweithiwr ar y tro. Gwnewch yr eitem honno'n dasg gyflawn, gan gynnwys yr URL a'r proxy a ddewiswyd, fel nad yw'r gweithiwr yn casglu ei lwybr o restr fyd-eang sy'n newid.

Ar gyfer urls meidrol, darparwch restr nad yw'n wag o URLau proxy wedi'u dilysu. Mae ymgeiswyr HTTP cyhoeddus ar gael yn y rhestr proxy HTTP:

from concurrent.futures import ThreadPoolExecutor
from itertools import cycle
import requests

def fetch(job):
    url, proxy_url = job
    proxies = {"http": proxy_url, "https": proxy_url}
    with requests.get(url, proxies=proxies, timeout=(5, 15)) as response:
        response.raise_for_status()
        return url, response.text

if not proxy_urls:
    raise ValueError("No proxy endpoints were supplied")

jobs = zip(urls, cycle(proxy_urls))
with ThreadPoolExecutor(max_workers=5) as executor:
    for url, body in executor.map(fetch, jobs):
        handle_result(url, body)

Mae urls, proxy_urls a handle_result yn cael eu darparu gan y cymhwysiad. Mae'r cydlynydd yn neilltuo pwyntiau terfynol mewn trefn ailadroddus; mae pob gweithiwr yn derbyn un pâr sefydlog. Mae ailadrodd y canlyniadau hefyd yn datgelu eithriadau gweithwyr.

Mae pum gweithiwr yn cyfyngu tasgau gweithredol, nid tasgau gweithredol fesul proxy. Os oes gan y rhestr ddau bwynt terfynol, gall sawl tasg ddefnyddio'r un pwynt terfynol ar yr un pryd. Ychwanegwch reol capasiti ar wahân fesul pwynt terfynol pan fo angen. Ar gyfer un dasg weithredol fesul URL pwynt terfynol, gall les ciw wedi'i gydamseru gadw a dychwelyd pob cofnod.

Dylai ailgynnig greu cynnig newydd wedi'i ffinio ar gyfer yr un URL. Osgoewch alwadau ailgynnig ailadroddus sy'n dileu cofnodion o restr rannu: gall gweithiwr arall fod yn dewis ohoni, ac mae angen canlyniad penodol ar restr wedi'i disbyddu o hyd.

Erthyglau cysylltiedig