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 for øyeblikket er ledige for 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)

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 applikasjonens 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.

Relaterte artikler