Wann e puer Threads e klengen Proxy-Pool deelen, kann d'Auswiel vun engem zoufällegen Andrag zwee aktiven Operatiounen dee selwechte Proxy ginn. Eng Queue kann d'Andräg halen, déi am Moment zum Ausléinen disponibel sinn:

from contextlib import contextmanager
from queue import Queue

available = Queue()
for endpoint in dict.fromkeys(proxy_urls):
    available.put(endpoint)

@contextmanager
def borrow_proxy():
    endpoint = available.get(timeout=5)
    try:
        yield endpoint
    finally:
        available.put(endpoint)

def process_url(url):
    with borrow_proxy() as endpoint:
        return fetch_one(url, endpoint)

Baut d'Queue eng Kéier, ier dir d'Aarbechtsthreads start. proxy_urls enthält komplett Endpunkt-URLen. Ëffentlech Kandidaten sinn an der Lëscht vun de gratis Proxien disponibel; benotzt de Protokoll an d'URL-Format, déi fetch_one ënnerstëtzt. Déi existent synchron fetch_one-Funktioun muss hir Netzwierkoperatioun fäerdeg maachen an all Äntwert zoumaachen, ier se zréckkënnt. Soss géif d'Auslei ophalen, während d'Verbindung nach dee Proxy benotzt.

Queue.get hëlt een disponibelen Andrag atomar eraus. En erschöpfte Pool waart, amplaz ëmmer erëm gedeelt Fändelen ze scannen. Wann an fënnef Sekonnen keen Andrag kënnt, erreecht queue.Empty den Uruffuer; wielt fir dee Resultat d'Widderhuelungs-, Fehler- oder Annullatiounspolitik vun der Applikatioun.

Den finally-Block gëtt en erwuewenen Andrag no Erfolleg oder enger Ausnam zréck. Hie behaapt net, datt een duerchgefallenen Endpunkt gesond ass. Quarantän-, Ersatz- an Ofkillungspolitike brauchen en explizite Wee, amplaz jidden Proxy, deen e temporäre Feeler gesäit, stëllem ze verwerpen.

D'Eliminatioun vun duebelen identeschen URL-Stringen verhënnert duebel Queue-Andräg. Verschidden URLen kënnen nach ëmmer op dee selwechte physesche Proxy oder Ausgang weisen; gruppéiert se bewosst, wann Exklusivitéit fir dee gedeelte Ressource gelte soll. D'Queue koordinéiert Threads an dësem Prozess, net Aarbechter op aneren Maschinnen.

Ähnlech Artikelen