Del en proxy-pulje mellem Python-tråde med en kø
Brug en synkroniseret kø og en finally-blok til at reservere én proxy til en synkron trådoperation og returnere den bagefter.
Når flere tråde deler en lille proxy-pulje, kan valget af en tilfældig post give to aktive operationer den samme proxy. En kø kan holde de poster, der i øjeblikket er ledige til lån:
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)
Byg køen én gang, før arbejdstrådene startes. proxy_urls indeholder fulde endpoint-URL'er. Offentlige kandidater findes i listen over gratis proxier; brug den protokol og det URL-format, som fetch_one understøtter. Den eksisterende synkrone fetch_one-funktion skal afslutte sin netværksoperation og lukke ethvert svar, før den vender tilbage. Ellers ville lånet slutte, mens forbindelsen stadig bruger den proxy.
Queue.get fjerner én ledig post atomart. En udtømt pulje venter i stedet for gentagne gange at scanne delte flag. Hvis der ikke kommer en post inden for fem sekunder, når queue.Empty kalderen; vælg applikationens politik for genforsøg, fejl eller annullering for det resultat.
Finally-blokken returnerer en erhvervet post efter succes eller en undtagelse. Den erklærer ikke, at et mislykket endpoint er sundt. Karantæne-, udskiftnings- og nedkølingspolitikker kræver en eksplicit vej i stedet for lydløst at kassere hver proxy, der ser en midlertidig fejl.
Deduplikering af identiske URL-strenge forhindrer dobbelte køposter. Forskellige URL'er kan stadig pege på den samme fysiske proxy eller udgang; gruppér dem bevidst, hvis eksklusivitet skal gælde for den delte ressource. Køen koordinerer tråde i denne proces, ikke arbejdere på andre maskiner.