Asigni URL kaj prokuron al ĉiu Python ThreadPoolExecutor-tasko
Asignu prokuron antaŭ ol sendi Python-petotaskon, anstataŭ lasi laborantojn konkuri pri komuna ŝanĝebla elekta stato.
La map de naĝejo transdonas unu eron al la laboranto samtempe. Faru tiun eron kompleta tasko, inkluzive la URL-on kaj elektitan prokuron, por ke la laboranto ne deduku sian itineron el ŝanĝiĝanta tutmonda listo.
Por finhavaj urls, provizu ne-malan liston de validigitaj prokuraj URL-oj. Publikaj HTTP-kandidatoj haveblas en la listo de HTTP-prokuroj:
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 kaj handle_result estas provizataj de la aplikaĵo. La kunordiganto asignas finpunktojn laŭ ripeta ordo; ĉiu laboranto ricevas unu fiksan paron. Ripetado de la rezultoj ankaŭ malkaŝas esceptojn de laborantoj.
Kvin laborantoj limigas aktivajn taskojn, ne aktivajn taskojn po prokuro. Se la listo havas du finpunktojn, pluraj taskoj povas samtempe uzi la saman finpunkton. Aldonu apartan kapacitregulon po finpunkto, kiam tio necesas. Por unu aktiva tasko po finpunkta URL, sinkronigita vico-luo povas rezervi kaj redoni ĉiun eron.
Riprovo devus krei novan limigitan provon por la sama URL. Evitu rekursiajn ripetajn alvokojn, kiuj forigas erojn el komuna listo: alia laboranto eble elektas el ĝi, kaj elĉerpita listo ankoraŭ bezonas eksplicitan rezulton.