Del ein proxy-pool mellom Python-trådar med ein kø
Bruk ein synkronisert kø og ein finally-blokk for å reservera éin proxy til ein synkron trådoperasjon og returnera han etterpå.
Når fleire trådar deler ein liten proxy-pool, kan valet av ei tilfeldig oppføring gje to aktive operasjonar same proxy. Ein kø kan halda oppføringane som er ledige for lån no:
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 éin gong, før arbeidstrådane startar. proxy_urls inneheld fullstendige endepunkt-URL-ar. Offentlege kandidatar er tilgjengelege i lista over gratis proxyar; bruk protokollen og URL-formatet som fetch_one støttar. Den eksisterande synkrone fetch_one-funksjonen må fullføra nettverksoperasjonen og lukka eventuelle svar før han returnerer. Elles ville lånet gå ut medan tilkoplinga framleis brukar proxyen.
Queue.get fjernar éi ledig oppføring atomisk. Ein tom pool ventar i staden for å skanna delte flagg om og om igjen. Kjem ingen oppføring innan fem sekund, når queue.Empty kallaren; vel politikk for nytt forsøk, feil eller avbrot i programmet for det resultatet.
Finally-blokka returnerer ei oppføring som er henta, etter suksess eller eit unntak. Ho erklærer ikkje at eit mislukka endepunkt er friskt. Karantene-, erstatnings- og nedkjølingspolitikkar treng ein eksplisitt veg i staden for å kasta kvar proxy som ser ein mellombels feil i det stille.
Deduplisering av identiske URL-strengar hindrar doble køoppføringar. Ulike URL-ar kan framleis peika på same fysiske proxy eller utgang; grupper dei med vilje om eksklusivitet skal gjelda for den delte ressursen. Køen koordinerer trådar i denne prosessen, ikkje arbeidarar på andre maskinar.