D'map vun engem Pool iwwergëtt dem Aarbechter ee Stéck op eemol. Maacht dëst Stéck eng komplett Aufgab, inklusiv d'URL an de gewielte Proxy, sou datt den Aarbechter seng Route net aus enger verännerlecher globaler Lëscht ofleede muss.

Fir endlech urls, gitt eng net eidel Lëscht vu validéierte Proxy-URLen un. Ëffentlech HTTP-Kandidaten sinn an der HTTP-Proxy-Lëscht verfügbar:

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 an handle_result ginn vun der Applikatioun geliwwert. De Koordinator deelt Endpunkter an enger widderhuelender Reihenfolge zou; all Aarbechter kritt ee feste Paar. D'Iteratioun iwwer d'Resultater bréngt och d'Aarbechter-Ausnamen un d'Luucht.

Fënnef Aarbechter limitéieren aktiv Aufgaben, net aktiv Aufgaben pro Proxy. Wann d'Lëscht zwee Endpunkter huet, kënnen e puer Aufgaben de selwechten Endpunkt gläichzäiteg benotzen. Füügt eng separat Kapazitéitsregel pro Endpunkt derbäi wann néideg. Fir eng aktiv Aufgab pro Endpunkt-URL kann eng synchroniséiert Schlaang-Léin all Andro reservéieren an zréckginn.

En neien Versuch soll en neien, begrenzten Versuch fir déiselwecht URL erstellen. Vermeit rekursiv Neiversich-Uruff, déi Androe vun enger gedeelter Lëscht ewechhuelen: en aneren Aarbechter kann doraus auswielen, an eng erschöpft Lëscht brauch nach ëmmer en explizitt Resultat.

Ähnlech Artikelen