Ein basseng sin map sender eitt element om gongen til arbeidaren. Gjer det elementet til ein komplett jobb, inkludert URL-en og den valde proxyen, slik at arbeidaren ikkje utleiar ruta si frå ei skiftande global liste.

For eit endeleg tal urls, oppgi ei ikkje-tom liste med validerte proxy-URL-ar. Offentlege HTTP-kandidatar er tilgjengelege i HTTP-proxylista:

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 vert leverte av applikasjonen. Koordinatoren tildeler endepunkt i ein gjenteken rekkjefølgje; kvar arbeidar mottek eitt fast par. Iterering av resultata avdekkjer også arbeidarunntak.

Fem arbeidarar avgrensar aktive jobbar, ikkje aktive jobbar per proxy. Viss lista har to endepunkt, kan fleire jobbar bruke same endepunkt samstundes. Legg til ein eigen kapasitetsregel per endepunkt når det er naudsynt. For éin aktiv jobb per endepunkts-URL kan ein synkronisert køleige reservere og returnere kvar oppføring.

Eit nytt forsøk bør opprette eit nytt avgrensa forsøk for same URL. Unngå rekursive nytt-forsøk-kall som fjernar oppføringar frå ei delt liste: ein annan arbeidar kan vere i ferd med å velje frå henne, og ei uttømd liste treng framleis eit eksplisitt resultat.

Relaterte artiklar