En pools map skickar ett objekt i taget till arbetaren. Gör det objektet till ett komplett jobb, inklusive URL:en och den valda proxyn, så att arbetaren inte härleder sin väg från en föränderlig global lista.

För ett ändligt antal urls anger du en icke-tom lista med validerade proxy-URL:er. Offentliga HTTP-kandidater finns i HTTP-proxylistan:

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 och handle_result tillhandahålls av applikationen. Koordinatorn tilldelar slutpunkter i en upprepad ordning; varje arbetare får ett fast par. Iterering av resultaten synliggör också arbetarnas undantag.

Fem arbetare begränsar aktiva jobb, inte aktiva jobb per proxy. Om listan har två slutpunkter kan flera jobb använda samma slutpunkt samtidigt. Lägg till en separat kapacitetsregel per slutpunkt när det behövs. För ett aktivt jobb per slutpunkts-URL kan en synkroniserad köleasing reservera och returnera varje post.

Ett nytt försök bör skapa ett nytt begränsat försök för samma URL. Undvik rekursiva nytt-försök-anrop som tar bort poster från en delad lista: en annan arbetare kan välja från den, och en uttömd lista behöver fortfarande ett uttryckligt resultat.

Relaterade artiklar