Eng URL an e Proxy fir all Python ThreadPoolExecutor-Aufgab zouweise
Weist e Proxy zou, ier Dir eng Python-Ufro-Aufgab ofschéckt, amplaz d'Aarbechter ëm gedeelten, verännerlechen Auswalszoustand konkurréiere ze loossen.
D'map vun engem Pool iwwergëtt dem Aarbechter ee Stéck op eemol. Maacht dëst Stéck eng komplett Aufgab, inklusiv d'URL an de gewielte Proxy, sou datt den Aarbechter seng Route net aus enger verännerlecher globaler Lëscht ofleede muss.
Fir endlech urls, gitt eng net eidel Lëscht vu validéierte Proxy-URLen un. Ëffentlech HTTP-Kandidaten sinn an der HTTP-Proxy-Lëscht verfügbar:
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 an handle_result ginn vun der Applikatioun geliwwert. De Koordinator deelt Endpunkter an enger widderhuelender Reihenfolge zou; all Aarbechter kritt ee feste Paar. D'Iteratioun iwwer d'Resultater bréngt och d'Aarbechter-Ausnamen un d'Luucht.
Fënnef Aarbechter limitéieren aktiv Aufgaben, net aktiv Aufgaben pro Proxy. Wann d'Lëscht zwee Endpunkter huet, kënnen e puer Aufgaben de selwechten Endpunkt gläichzäiteg benotzen. Füügt eng separat Kapazitéitsregel pro Endpunkt derbäi wann néideg. Fir eng aktiv Aufgab pro Endpunkt-URL kann eng synchroniséiert Schlaang-Léin all Andro reservéieren an zréckginn.
En neien Versuch soll en neien, begrenzten Versuch fir déiselwecht URL erstellen. Vermeit rekursiv Neiversich-Uruff, déi Androe vun enger gedeelter Lëscht ewechhuelen: en aneren Aarbechter kann doraus auswielen, an eng erschöpft Lëscht brauch nach ëmmer en explizitt Resultat.