Esleitu URL bat eta proxy bat Python ThreadPoolExecutor lan bakoitzari
Esleitu proxy bat Python eskaera lana bidali aurretik, langileek hautapen-egoera partekatu aldakorrarengatik lehiatzea saihesteko.
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.