Pool baten map-ek elementu bat pasatzen dio langileari aldiro. Egin elementu hori lan oso bat, URL-a eta hautatutako proxy-a barne, langileak bere ibilbidea aldatzen ari den zerrenda global batetik ondoriozta ez dezan.

urls kopuru finituetarako, eman balioztatutako proxy URL-en zerrenda ez-huts bat. HTTP hautagai publikoak HTTP proxy zerrendan daude:

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)

urls, proxy_urls eta handle_result aplikazioak ematen ditu. Koordinatzaileak amaierako puntuak errepikatzen den ordenan esleitzen ditu; langile bakoitzak pare finko bat jasotzen du. Emaitzak errepikatzeak langileen salbuespenak ere agerian uzten ditu.

Bost langilek lan aktiboak mugatzen dituzte, ez proxy bakoitzeko lan aktiboak. Zerrendak bi amaiera-puntu baditu, hainbat lanek amaiera-puntu bera erabil dezakete aldi berean. Gehitu amaiera-puntu bakoitzeko gaitasun-arau bereizi bat behar denean. Amaiera-puntu URL bakoitzeko lan aktibo bat lortzeko, ilara-errentamendu sinkronizatua-ek sarrera bakoitza erreserbatu eta itzuli dezake.

Berriz saiatzeak URL bererako saiakera mugatu berri bat sortu beharko luke. Saihestu zerrenda partekatu batetik sarrerak kentzen dituzten berriz saiatzeko dei errekurtsiboak: beste langile bat hortik hautatzen egon daiteke, eta agortutako zerrendak emaitza esplizitu bat behar du oraindik.

Erlazionatutako artikuluak