Kada nekoliko niti deli mali proxy skup, izbor slučajnog unosa može dvema aktivnim operacijama dati isti proxy. Red može držati unose koji su trenutno dostupni za pozajmljivanje:

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)

Izgradite red jednom, pre pokretanja radnih niti. proxy_urls sadrži potpune URL adrese krajnjih tačaka. Javni kandidati dostupni su na listi besplatnih proxija; koristite protokol i format URL-a koje fetch_one podržava. Postojeća sinhrona funkcija fetch_one mora završiti svoju mrežnu operaciju i zatvoriti svaki odgovor pre povratka. Inače bi pozajmica završila dok veza još koristi taj proxy.

Queue.get atomski uklanja jedan dostupni unos. Iscrpljen skup čeka umesto da više puta skenira deljene zastavice. Ako unos ne stigne u roku od pet sekundi, queue.Empty dolazi do pozivaoca; izaberite politiku ponovnog pokušaja, neuspeha ili otkazivanja aplikacije za taj rezultat.

Blok finally vraća preuzeti unos nakon uspeha ili izuzetka. On ne tvrdi da je neuspešna krajnja tačka zdrava. Politike karantina, zamene i hlađenja zahtevaju izričit put umesto tihog odbacivanja svakog proxija koji vidi privremenu grešku.

Uklanjanje duplikata identičnih URL nizova sprečava dvostruke unose u redu. Različiti URL-ovi i dalje mogu upućivati na isti fizički proxy ili izlaz; grupišite ih namerno ako ekskluzivnost treba da važi za taj deljeni resurs. Red usklađuje niti u ovom procesu, a ne radnike na drugim mašinama.

Povezani članci