Compartir un conxunto de proxies entre fíos de Python cunha cola
Use unha cola sincronizada e un bloque finally para reservar un proxy para unha operación de fío sincronizada e devolvelo despois.
Cando varios fíos comparten un conxunto pequeno de proxies, escoller unha entrada ao azar pode dar o mesmo proxy a dúas operacións activas. Unha cola pode conter as entradas dispoñibles para emprestar neste momento:
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)
Constrúa a cola unha vez, antes de iniciar os fíos de traballo. proxy_urls contén URL de extremo completas. Os candidatos públicos están dispoñibles na lista de proxies gratuítos; use o protocolo e o formato de URL que admite fetch_one. A función fetch_one sincronizada existente debe rematar a súa operación de rede e pechar calquera resposta antes de volver. Se non, o préstamo remataría mentres a conexión aínda usa ese proxy.
Queue.get elimina atomicamente unha entrada dispoñible. Un conxunto esgotado espera en lugar de escanear repetidamente indicadores compartidos. Se non chega ningunha entrada en cinco segundos, queue.Empty chega ao chamador; escolla a política de reintento, fallo ou cancelación da aplicación para ese resultado.
O bloque finally devolve unha entrada adquirida despois do éxito ou dunha excepción. Non declara que un extremo fallido sexa saudable. As políticas de corentena, substitución e arrefriamento necesitan un camiño explícito en lugar de descartar silenciosamente cada proxy que ve un erro temporal.
A deduplicación de cadeas de URL idénticas evita entradas duplicadas na cola. URL distintas aínda poden referirse ao mesmo proxy físico ou saída; agrúpeas deliberadamente se a exclusividade debe aplicarse a ese recurso compartido. A cola coordina fíos neste proceso, non traballadores noutras máquinas.