Vsaki nalogi Python ThreadPoolExecutor dodelite URL in proxy
Dodelite proxy pred pošiljanjem naloge zahteve Python, namesto da pustite delavce, da tekmujejo za skupno spremenljivo stanje izbire.
map nabora delavcu preda en element naenkrat. Naredite ta element popolno nalogo, vključno z URL in izbranim proxyjem, da delavec svoje poti ne sklepa iz spreminjajočega se globalnega seznama.
Za končne urls navedite neprazen seznam preverjenih URL proxyjev. Javni kandidati HTTP so na voljo na seznamu proxyjev 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 in handle_result zagotavlja aplikacija. Koordinator dodeljuje končne točke v ponavljajočem se vrstnem redu; vsak delavec prejme en fiksen par. Ponavljanje rezultatov razkrije tudi izjeme delavcev.
Pet delavcev omejuje aktivne naloge, ne aktivnih nalog na proxy. Če ima seznam dve končni točki, lahko več nalog hkrati uporablja isto končno točko. Po potrebi dodajte ločeno pravilo zmogljivosti za vsako končno točko. Za eno aktivno nalogo na URL končne točke lahko sinhroniziran najem čakalne vrste rezervira in vrne vsak vnos.
Ponovni poskus naj ustvari nov omejen poskus za isti URL. Izogibajte se rekurzivnim klicem ponovnega poskusa, ki odstranijo vnose s skupnega seznama: drug delavec morda izbira z njega, izčrpan seznam pa še vedno potrebuje jasen izid.