Del en proxy-pool mellom Python-tråder med en kø
Bruk en synkronisert kø og en finally-blokk for å reservere én proxy for en synkron trådoperasjon og returnere den etterpå.
Når flere tråder deler en liten proxy-pool, kan valget av en tilfeldig oppføring gi to aktive operasjoner samme proxy. En kø kan holde oppføringene som er ledige for lån akkurat 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)
Bygg køen én gang, før arbeidstrådene startes. proxy_urls inneholder fullstendige endepunkt-URL-er. Offentlige kandidater er tilgjengelige i listen over gratis proxyer; bruk protokollen og URL-formatet som fetch_one støtter. Den eksisterende synkrone fetch_one-funksjonen må fullføre nettverksoperasjonen og lukke eventuelle svar før den returnerer. Ellers ville lånet utløpe mens tilkoblingen fortsatt bruker proxyen.
Queue.get fjerner én ledig oppføring atomisk. En uttømt pool venter i stedet for å skanne delte flagg gjentatte ganger. Hvis ingen oppføring kommer innen fem sekunder, når queue.Empty den som kaller; velg programmets policy for nytt forsøk, feil eller avbrudd for det resultatet.
Finally-blokken returnerer en oppføring som er hentet, etter suksess eller et unntak. Den erklærer ikke at et mislykket endepunkt er friskt. Karantene-, erstatnings- og nedkjølingspolicyer trenger en eksplisitt vei i stedet for å forkaste hver proxy som ser en midlertidig feil i stillhet.
Deduplisering av identiske URL-strenger forhindrer doble køoppføringer. Ulike URL-er kan fortsatt peke på samme fysiske proxy eller utgang; grupper dem bevisst hvis eksklusivitet skal gjelde for den delte ressursen. Køen koordinerer tråder i denne prosessen, ikke arbeidere på andre maskiner.