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.

Relaterte artikler