Pūla map nodod strādniekam vienu vienumu vienlaikus. Padariet šo vienumu par pilnīgu darbu, iekļaujot URL un izvēlēto starpniekserveri, lai strādnieks neizsecinātu savu maršrutu no mainīga globāla saraksta.

Ierobežotam urls skaitam norādiet ne tukšu validētu starpniekservera URL sarakstu. Publiski HTTP kandidāti ir pieejami HTTP starpniekserveru sarakstā:

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 un handle_result nodrošina lietojumprogramma. Koordinators piešķir galapunktus atkārtotā secībā; katrs strādnieks saņem vienu fiksētu pāri. Rezultātu atkārtošana arī atklāj strādnieku izņēmumus.

Pieci strādnieki ierobežo aktīvos darbus, nevis aktīvos darbus uz vienu starpniekserveri. Ja sarakstā ir divi galapunkti, vairāki darbi var vienlaikus izmantot vienu un to pašu galapunktu. Ja nepieciešams, pievienojiet atsevišķu jaudas noteikumu katram galapunktam. Vienam aktīvam darbam uz vienu galapunkta URL sinhronizēta rindas noma var rezervēt un atgriezt katru ierakstu.

Atkārtotam mēģinājumam jāizveido jauns ierobežots mēģinājums tam pašam URL. Izvairieties no rekursīviem atkārtotas mēģināšanas izsaukumiem, kas noņem ierakstus no kopīga saraksta: cits strādnieks var no tā izvēlēties, un izsmelts saraksts joprojām prasa skaidru rezultātu.

Saistītie raksti