Kur disa fije ndajnë një grup të vogël proxy-sh, zgjedhja e një zëri të rastësishëm mund t'u japë dy operacioneve aktive të njëjtin proxy. Një radhë mund të mbajë zërat që janë aktualisht të disponueshëm për huazim:

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)

Ndërtoni radhën një herë, përpara se të nisni fijet punuese. proxy_urls përmban URL të plota pikash fundore. Kandidatët publikë janë të disponueshëm në listën e proxy-ve falas; përdorni protokollin dhe formatin e URL-së që mbështet fetch_one. Funksioni ekzistues sinkron fetch_one duhet të përfundojë operacionin e tij të rrjetit dhe të mbyllë çdo përgjigje përpara se të kthehet. Përndryshe huazimi do të përfundonte ndërsa lidhja vazhdon të përdorë atë proxy.

Queue.get heq në mënyrë atomike një zë të disponueshëm. Një grup i shteruar pret në vend që të skanojë vazhdimisht flamuj të përbashkët. Nëse asnjë zë nuk arrin brenda pesë sekondash, queue.Empty arrin te thirrësi; zgjidhni politikën e ripërpjekjes, dështimit ose anulimit të aplikacionit për atë rezultat.

Blloku finally kthen një zë të fituar pas suksesit ose një përjashtimi. Ai nuk deklaron se një pikë fundore e dështuar është e shëndetshme. Politikat e karantinës, zëvendësimit dhe ftohjes kërkojnë një rrugë të qartë në vend që të hedhin në heshtje çdo proxy që sheh një gabim të përkohshëm.

Heqja e dublikatave të vargjeve identike URL parandalon zëra të dyfishtë në radhë. URL të ndryshme mund të tregojnë ende të njëjtin proxy fizik ose dalje; grupopini ato me qëllim nëse ekskluziviteti duhet të zbatohet për atë burim të përbashkët. Radha koordinon fijet në këtë proces, jo punëtorët në makina të tjera.

Artikuj të ngjashëm