Telkinio map perduoda darbininkui po vieną elementą. Padarykite tą elementą visa užduotimi, įskaitant URL ir pasirinktą tarpinį serverį, kad darbininkas nenuspėtų savo maršruto iš kintančio globalaus sąrašo.

Baigtiniam urls skaičiui pateikite netuščią patvirtintų tarpinio serverio URL sąrašą. Vieši HTTP kandidatai prieinami HTTP tarpinių serverių sąraše:

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 ir handle_result pateikia programa. Koordinatorius priskiria galinius taškus pasikartojančia tvarka; kiekvienas darbininkas gauna vieną fiksuotą porą. Rezultatų kartojimas taip pat atskleidžia darbininkų išimtis.

Penki darbininkai riboja aktyvias užduotis, o ne aktyvias užduotis vienam tarpiniam serveriui. Jei sąraše yra du galiniai taškai, kelios užduotys gali vienu metu naudoti tą patį galinį tašką. Prireikus pridėkite atskirą talpos taisyklę kiekvienam galiniam taškui. Vienai aktyviai užduočiai vienam galinio taško URL sinchronizuota eilės nuoma gali rezervuoti ir grąžinti kiekvieną įrašą.

Pakartotinis bandymas turėtų sukurti naują ribotą bandymą tam pačiam URL. Venkite rekursinių pakartotinio bandymo kvietimų, kurie pašalina įrašus iš bendro sąrašo: kitas darbininkas gali iš jo rinktis, o išnaudotas sąrašas vis tiek reikalauja aiškaus rezultato.

Susiję straipsniai