Ken 'n URL en proxy aan elke Python ThreadPoolExecutor-taak toe
Ken 'n proxy toe voordat 'n Python-versoektaak ingedien word, eerder as om werkers oor gedeelde veranderlike keusestatus te laat meeding.
'n Poel se map gee een item op 'n slag aan die werker. Maak daardie item 'n volledige taak, insluitend die URL en gekose proxy, sodat die werker nie sy roete uit 'n veranderende globale lys aflei nie.
Vir 'n eindige urls, verskaf 'n nie-leë lys van gevalideerde proxy-URL's. Publieke HTTP-kandidate is beskikbaar in die HTTP-proxylys:
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 en handle_result word deur die toepassing verskaf. Die koördineerder ken eindpunte in 'n herhalende volgorde toe; elke werker ontvang een vaste paar. Deur die resultate te itereer, kom werker-uitsonderings ook na vore.
Vyf werkers beperk aktiewe take, nie aktiewe take per proxy nie. As die lys twee eindpunte het, kan verskeie take dieselfde eindpunt gelyktydig gebruik. Voeg 'n aparte kapasiteitsreël per eindpunt by wanneer dit nodig is. Vir een aktiewe taak per eindpunt-URL kan 'n gesinchroniseerde ryhuur elke inskrywing reserveer en teruggee.
'n Herprobeerslag moet 'n nuwe begrensde poging vir dieselfde URL skep. Vermy rekursiewe herprobeer-oproepe wat inskrywings uit 'n gedeelde lys verwyder: 'n ander werker mag daaruit kies, en 'n uitgeputte lys het steeds 'n eksplisiete uitkoms nodig.