Partager un pool de proxys entre threads Python avec une file
Utilisez une file synchronisée et un bloc finally pour réserver un proxy à une opération de thread synchrone, puis le rendre ensuite.
Lorsque plusieurs threads partagent un petit pool de proxys, choisir une entrée au hasard peut attribuer le même proxy à deux opérations actives. Une file peut contenir les entrées actuellement disponibles à l'emprunt :
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)
Construisez la file une seule fois, avant de démarrer les threads de travail. proxy_urls contient des URL de point de terminaison complètes. Des candidats publics sont disponibles dans la liste de proxys gratuits ; utilisez le protocole et le format d'URL pris en charge par fetch_one. La fonction fetch_one synchrone existante doit terminer son opération réseau et fermer toute réponse avant de revenir. Sinon, l'emprunt se terminerait alors que la connexion utilise encore ce proxy.
Queue.get retire atomiquement une entrée disponible. Un pool épuisé attend au lieu de scanner à plusieurs reprises des indicateurs partagés. Si aucune entrée n'arrive dans les cinq secondes, queue.Empty parvient à l'appelant ; choisissez la politique de nouvelle tentative, d'échec ou d'annulation de l'application pour ce résultat.
Le bloc finally rend une entrée acquise après un succès ou une exception. Il ne déclare pas qu'un point de terminaison en échec est sain. Les politiques de quarantaine, de remplacement et de refroidissement nécessitent un chemin explicite plutôt que de rejeter silencieusement chaque proxy qui rencontre une erreur temporaire.
La déduplication des chaînes d'URL identiques évite les entrées de file en double. Des URL distinctes peuvent toujours désigner le même proxy physique ou la même sortie ; regroupez-les délibérément si l'exclusivité doit s'appliquer à cette ressource partagée. La file coordonne les threads de ce processus, pas les workers d'autres machines.