Basaini map edastab töötajale korraga ühe üksuse. Tee sellest üksusest täielik töö, sealhulgas URL ja valitud puhverserver, et töötaja ei tuletaks oma marsruuti muutuvast globaalsest loendist.

Lõpliku arvu urls'i jaoks esita mittetühi valideeritud puhverserveri URL-ide loend. Avalikud HTTP kandidaadid on saadaval HTTP puhverserverite loendis:

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 ja handle_result esitab rakendus. Koordinaator määrab lõpp-punktid korduvas järjekorras; iga töötaja saab ühe fikseeritud paari. Tulemuste itereerimine toob esile ka töötajate erandid.

Viis töötajat piiravad aktiivseid töid, mitte aktiivseid töid puhverserveri kohta. Kui loendis on kaks lõpp-punkti, võivad mitmed tööd kasutada sama lõpp-punkti korraga. Lisa vajaduse korral eraldi võimsusreegel iga lõpp-punkti kohta. Ühe aktiivse töö jaoks lõpp-punkti URL-i kohta saab sünkroonitud järjekorra rendileping iga kirje reserveerida ja tagastada.

Korduskatse peaks looma sama URL-i jaoks uue piiratud katse. Väldi rekursiivseid korduskatse kutseid, mis eemaldavad kirjeid jagatud loendist: teine töötaja võib sealt valida ja ammendunud loend vajab siiski selget tulemust.

Seotud artiklid