En pools map sender ét element ad gangen til arbejderen. Gør det element til et komplet job med URL og valgt proxy, så arbejderen ikke udleder sin rute fra en skiftende global liste.

For et endeligt antal urls skal du angive en ikke-tom liste af validerede proxy-URL'er. Offentlige HTTP-kandidater findes 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 af applikationen. Koordinatoren tildeler endepunkter i en gentagen rækkefølge; hver arbejder modtager ét fast par. Iteration over resultaterne frembringer også arbejderundtagelser.

Fem arbejdere begrænser aktive job, ikke aktive job pr. proxy. Hvis listen har to endepunkter, kan flere job bruge samme endepunkt samtidigt. Tilføj en separat kapacitetsregel pr. endepunkt, når det er påkrævet. For ét aktivt job pr. endepunkts-URL kan en synkroniseret køleje reservere og returnere hver post.

Et nyt forsøg bør oprette et nyt afgrænset forsøg for den samme URL. Undgå rekursive genforsøgs-kald, der fjerner poster fra en delt liste: en anden arbejder kan være ved at vælge fra den, og en udtømt liste kræver stadig et eksplicit resultat.

Relaterede artikler