Määritä URL ja välityspalvelin jokaiselle Python ThreadPoolExecutor -työlle
Määritä välityspalvelin ennen Python-pyyntötyön lähettämistä sen sijaan, että antaisit työntekijöiden kilpailla jaetusta muuttuvasta valintatilasta.
Altaan map välittää työntekijälle yhden kohteen kerrallaan. Tee siitä kohteesta täydellinen työ, mukaan lukien URL ja valittu välityspalvelin, jotta työntekijä ei päättele reittiään muuttuvasta globaalista luettelosta.
Äärellisille urls-arvoille anna ei-tyhjä luettelo validoiduista välityspalvelimen URL-osoitteista. Julkiset HTTP-ehdokkaat ovat saatavilla HTTP-välityspalvelinluettelossa:
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 ja handle_result toimittaa sovellus. Koordinaattori määrittää päätepisteet toistuvassa järjestyksessä; jokainen työntekijä saa yhden kiinteän parin. Tulosten läpikäynti tuo esiin myös työntekijöiden poikkeukset.
Viisi työntekijää rajoittaa aktiivisia töitä, ei aktiivisia töitä välityspalvelinta kohden. Jos luettelossa on kaksi päätepistettä, useat työt voivat käyttää samaa päätepistettä samanaikaisesti. Lisää erillinen kapasiteettisääntö päätepistettä kohden, kun sitä tarvitaan. Yhtä aktiivista työtä varten päätepisteen URL-osoitetta kohden synkronoitu jonovuokraus voi varata ja palauttaa jokaisen merkinnän.
Uudelleenyrityksen tulisi luoda uusi rajoitettu yritys samalle URL:lle. Vältä rekursiivisia uudelleenyrityskutsuja, jotka poistavat merkintöjä jaetusta luettelosta: toinen työntekijä saattaa valita siitä, ja tyhjentynyt luettelo tarvitsee silti eksplisiittisen tuloksen.