Доделете URL и прокси на секое Python ThreadPoolExecutor работно место
Доделете прокси пред да поднесете Python барање за работа наместо да дозволите работниците да се натпреваруваат за споделено променливо состојба на избор.
map на базенот му предава на работникот еден елемент по еден. Направете го тој елемент целосна работа, вклучувајќи го URL-то и избраното прокси, за работникот да не ја изведува својата рута од променлива глобална листа.
За конечен број urls, доставите непразна листа на валидирани прокси URL-а. Јавните HTTP кандидати се достапни во листата на 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 и handle_result ги обезбедува апликацијата. Координаторот доделува крајни точки во редослед што се повторува; секој работник добива еден фиксен пар. Повторувањето на резултатите исто така ги открива исклучоците на работниците.
Пет работници ограничуваат активни работи, а не активни работи по прокси. Ако листата има две крајни точки, неколку работи можат истовремено да ја користат истата крајна точка. Додајте посебно правило за капацитет по крајна точка кога е потребно. За една активна работа по URL на крајна точка, синхронизиран закуп на ред може да резервира и врати секој запис.
Повторниот обид треба да создаде нов ограничен обид за истиот URL. Избегнувајте рекурзивни повици за повторен обид што отстрануваат записи од споделена листа: друг работник можеби избира од неа, а исцрпената листа сè уште бара јасен исход.