Quan diversos fils comparteixen un conjunt petit de proxys, triar una entrada a l'atzar pot assignar el mateix proxy a dues operacions actives. Una cua pot contenir les entrades disponibles per manllevar en aquest moment:

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)

Construïu la cua una vegada, abans d'iniciar els fils de treball. proxy_urls conté URL d'extrem completes. Els candidats públics estan disponibles a la llista de proxys gratuïts; feu servir el protocol i el format d'URL que admet fetch_one. La funció fetch_one sincrònica existent ha d'acabar la seva operació de xarxa i tancar qualsevol resposta abans de retornar. En cas contrari, el préstec acabaria mentre la connexió encara utilitza aquell proxy.

Queue.get elimina atòmicament una entrada disponible. Un conjunt esgotat espera en lloc d'escanejar repetidament indicadors compartits. Si no arriba cap entrada en cinc segons, queue.Empty arriba al cridador; trieu la política de reintent, fallada o cancel·lació de l'aplicació per a aquest resultat.

El bloc finally retorna una entrada obtinguda després d'un èxit o d'una excepció. No declara que un extrem fallit sigui saludable. Les polítiques de quarantena, substitució i refredament necessiten un camí explícit en lloc de descartar silenciosament cada proxy que veu un error temporal.

Deduplicar cadenes d'URL idèntiques evita entrades duplicades a la cua. URL diferents encara poden referir-se al mateix proxy físic o sortida; agrupeu-les deliberadament si l'exclusivitat ha d'aplicar-se a aquest recurs compartit. La cua coordina els fils d'aquest procés, no els treballadors d'altres màquines.

Articles relacionats