Tildel en URL og en proxy til hver Python ThreadPoolExecutor-jobb
Tildel en proxy før du sender inn en Python-forespørselsjobb, i stedet for å la arbeidere konkurrere om delt, foranderlig valgtilstand.
En pools map sender ett element om gangen til arbeideren. Gjør det elementet til en komplett jobb, inkludert URL-en og den valgte proxyen, slik at arbeideren ikke utleder ruten sin fra en skiftende global liste.
For et endelig antall urls, oppgi en ikke-tom liste med validerte proxy-URL-er. Offentlige HTTP-kandidater er tilgjengelige i HTTP-proxylisten:
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 og handle_result leveres av applikasjonen. Koordinatoren tildeler endepunkter i en gjentatt rekkefølge; hver arbeider mottar ett fast par. Iterering av resultatene avdekker også arbeiderunntak.
Fem arbeidere begrenser aktive jobber, ikke aktive jobber per proxy. Hvis listen har to endepunkter, kan flere jobber bruke samme endepunkt samtidig. Legg til en egen kapasitetsregel per endepunkt når det er nødvendig. For én aktiv jobb per endepunkts-URL kan en synkronisert køleie reservere og returnere hver oppføring.
Et nytt forsøk bør opprette et nytt begrenset forsøk for samme URL. Unngå rekursive nye-forsøk-kall som fjerner oppføringer fra en delt liste: en annen arbeider kan være i ferd med å velge fra den, og en uttømt liste trenger fortsatt et eksplisitt resultat.