In URL en proxy tawize oan elke Python ThreadPoolExecutor-taak
Wijs in proxy ta foardat jo in Python-fersyktaak yntsjinje, ynstee fan wurkers te litten stride oer dielde, feroarjende seleksjestatus.
De map fan in poel jout de wurker ien item tagelyk. Meitsje dat item in folsleine taak, ynklusyf de URL en keazen proxy, sadat de wurker syn rûte net ôfliedt út in feroarjende globale list.
Foar einige urls, leverje in net-lege list fan falidearre proxy-URL's. Iepenbiere HTTP-kandidaten binne beskikber yn 'e HTTP-proxy-list:
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 wurde troch de applikaasje levere. De koördinator tawizet einpunten yn in werheljende folchoarder; elke wurker krijt ien fêst pear. It iterearjen fan de resultaten lit ek wurker-útsûnderingen sjen.
Fiif wurkers beheine aktive taken, net aktive taken per proxy. As de list twa einpunten hat, kinne ferskate taken tagelyk itselde einpunt brûke. Foegje in aparte kapasiteitsregel per einpunt ta as dat nedich is. Foar ien aktive taak per einpunt-URL kin in syngronisearre wachtrige-ferhier elk item reservearje en weromjaan.
In nije poging moat in nije beheinde poging foar deselde URL meitsje. Foarkom rekursive nije-poging-opropen dy't items út in dielde list ferwiderje: in oare wurker kin derút selektearje, en in útputte list hat noch altyd in eksplisyt resultaat nedich.