Assegna un URL e un proxy a ogni attività Python ThreadPoolExecutor
Assegna un proxy prima di inviare un'attività di richiesta Python invece di lasciare che i worker competano per uno stato di selezione condiviso e mutabile.
La map di un pool passa un elemento al worker alla volta. Rendi quell'elemento un'attività completa, inclusi l'URL e il proxy selezionato, così il worker non deduce il proprio percorso da un elenco globale mutevole.
Per urls finite, fornisci un elenco non vuoto di URL proxy convalidate. Candidati HTTP pubblici sono disponibili nella lista di proxy 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 e handle_result sono forniti dall'applicazione. Il coordinatore assegna gli endpoint in un ordine ripetuto; ogni worker riceve una coppia fissa. Anche l'iterazione dei risultati fa emergere le eccezioni dei worker.
Cinque worker limitano le attività attive, non le attività attive per proxy. Se l'elenco ha due endpoint, più attività possono usare lo stesso endpoint contemporaneamente. Aggiungi una regola di capacità separata per endpoint quando serve. Per un'attività attiva per URL di endpoint, un leasing di coda sincronizzato può prenotare e restituire ogni voce.
Un nuovo tentativo dovrebbe creare un nuovo tentativo limitato per lo stesso URL. Evita le chiamate di nuovo tentativo ricorsive che rimuovono voci da un elenco condiviso: un altro worker potrebbe starvi selezionando, e un elenco esaurito necessita comunque di un esito esplicito.