Dodijelite URL i proxy svakom poslu Python ThreadPoolExecutor
Dodijelite proxy prije slanja posla zahtjeva u Pythonu umjesto da radnici jure na zajedničkom promjenjivom stanju odabira.
map bazena predaje radniku jednu stavku odjednom. Učinite tu stavku potpunim poslom, uključujući URL i odabrani proxy, kako radnik ne bi zaključivao svoju rutu iz promjenjive globalne liste.
Za konačan broj urls, dostavite nepraznu listu provjerenih proxy URL-ova. Javni HTTP kandidati dostupni su u listi HTTP proxyja:
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 dostavlja aplikacija. Koordinator dodjeljuje krajnje točke u ponavljajućem redu; svaki radnik dobija jedan fiksni par. Ponavljanje rezultata također otkriva izuzetke radnika.
Pet radnika ograničava aktivne poslove, a ne aktivne poslove po proxyju. Ako lista ima dvije krajnje točke, nekoliko poslova može istovremeno koristiti istu krajnju točku. Dodajte zasebno pravilo kapaciteta po krajnjoj točki kada je to potrebno. Za jedan aktivni posao po URL-u krajnje točke, sinkronizirani najam reda može rezervisati i vratiti svaki unos.
Ponovni pokušaj treba stvoriti novi ograničeni pokušaj za isti URL. Izbjegavajte rekurzivne pozive ponovnog pokušaja koji uklanjaju unose iz zajedničke liste: drugi radnik možda bira iz nje, a iscrpljena lista i dalje zahtijeva jasan ishod.