Proksialtaan jakaminen Python-säikeiden kesken jonolla
Käytä synkronoitua jonoa ja finally-lohkoa varataksesi yhden proksin synkronista säieoperaatiota varten ja palauttaaksesi sen jälkeen.
Kun useat säikeet jakavat pienen proksialtaan, satunnaisen merkinnän valinta voi antaa kahdelle aktiiviselle operaatiolle saman proksin. Jono voi pitää merkinnät, jotka ovat juuri nyt lainattavissa:
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)
Rakenna jono kerran ennen työsäikeiden käynnistämistä. proxy_urls sisältää täydelliset päätepiste-URL-osoitteet. Julkiset ehdokkaat ovat saatavilla ilmaisten proksien luettelossa; käytä protokollaa ja URL-muotoa, jota fetch_one tukee. Nykyisen synkronisen fetch_one-funktion on lopetettava verkkotoimintonsa ja suljettava mahdollinen vastaus ennen paluuta. Muuten laina päättyisi, kun yhteys käyttää vielä kyseistä proksia.
Queue.get poistaa yhden käytettävissä olevan merkinnän atomisesti. Tyhjentynyt allas odottaa sen sijaan, että se skannaisi jaettuja lippuja toistuvasti. Jos merkintää ei saavu viiden sekunnin kuluessa, queue.Empty saavuttaa kutsujan; valitse sovelluksen uudelleenyritys-, epäonnistumis- tai peruutuskäytäntö kyseiselle tulokselle.
Finally-lohko palauttaa hankitun merkinnän onnistumisen tai poikkeuksen jälkeen. Se ei ilmoita, että epäonnistunut päätepiste on terve. Karanteeni-, korvaus- ja jäähdytyskäytännöt tarvitsevat nimenomaisen polun sen sijaan, että jokainen tilapäisen virheen näkevä proksi hylättäisiin hiljaisesti.
Identtisten URL-merkkijonojen poistaminen estää jonon kaksoismerkinnät. Erilaiset URL-osoitteet voivat silti viitata samaan fyysiseen proksiin tai lähtöön; ryhmittele ne tarkoituksella, jos yksinoikeuden on sovelluttava kyseiseen jaettuun resurssiin. Jono koordinoi tämän prosessin säikeitä, ei muiden koneiden työntekijöitä.