El map d'un pool passa un element al treballador alhora. Fes que aquest element sigui una tasca completa, amb la URL i el proxy seleccionat, perquè el treballador no dedueixi la seva ruta d'una llista global canviant.

Per a un nombre finit d'urls, proporciona una llista no buida d'URL de proxy validades. Els candidats HTTP públics són disponibles a la llista de proxies HTTP:

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 i handle_result els proporciona l'aplicació. El coordinador assigna els punts finals en un ordre repetitiu; cada treballador rep un parell fix. Iterar els resultats també exposa les excepcions dels treballadors.

Cinc treballadors limiten les tasques actives, no les tasques actives per proxy. Si la llista té dos punts finals, diverses tasques poden utilitzar el mateix punt final simultàniament. Afegeix una regla de capacitat separada per punt final quan calgui. Per a una tasca activa per URL de punt final, un arrendament de cua sincronitzat pot reservar i retornar cada entrada.

Un reintent ha de crear un intent nou i limitat per a la mateixa URL. Evita les crides de reintent recursives que eliminen entrades d'una llista compartida: un altre treballador pot estar-hi seleccionant, i una llista esgotada encara necessita un resultat explícit.

Articles relacionats