Dodijelite URL i proxy svakom poslu Python ThreadPoolExecutor
Dodijelite proxy prije slanja posla zahtjeva u Pythonu umjesto da pustite radnike da se natječu za zajedničko promjenjivo stanje 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 promjenjivog globalnog popisa.
Za konačan broj urls, dostavite neprazan popis provjerenih proxy URL-ova. Javni HTTP kandidati dostupni su u popisu 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 popis 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, sinkronizovani 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čkog popisa: drugi radnik možda bira iz njega, a iscrpljeni popis i dalje zahtijeva jasan ishod.