Deljenje nabora posrednikov med Pythonovimi nitmi z vrsto
Uporabite sinhronizirano vrsto in blok finally, da rezervirate en posrednik za sinhrono nitno operacijo in ga nato vrnete.
Ko si več niti deli majhen nabor posrednikov, lahko izbira naključnega vnosa dvema aktivnima operacijama dodeli isti posrednik. Vrsta lahko hrani vnose, ki so trenutno na voljo za izposojo:
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)
Zgradite vrsto enkrat, preden zaženete delovne niti. proxy_urls vsebuje popolne URL končnih točk. Javni kandidati so na voljo na seznamu brezplačnih posrednikov; uporabite protokol in obliko URL, ki ju podpira fetch_one. Obstoječa sinhrona funkcija fetch_one mora pred vrnitvijo dokončati omrežno operacijo in zapreti vsak odgovor. Sicer bi se izposoja končala, medtem ko povezava še uporablja ta posrednik.
Queue.get atomsko odstrani en razpoložljiv vnos. Izčrpan nabor čaka, namesto da bi večkrat pregledal skupne zastavice. Če v petih sekundah ne pride noben vnos, queue.Empty doseže klicatelja; za ta rezultat izberite politiko ponovnega poskusa, napake ali preklica aplikacije.
Blok finally vrne pridobljeni vnos po uspehu ali izjemi. Ne razglaša, da je neuspešna končna točka zdrava. Politike karantene, zamenjave in ohlajanja potrebujejo izrecno pot, namesto da tiho zavržejo vsak posrednik, ki naleti na začasno napako.
Odpravljanje dvojnikov enakih nizov URL preprečuje podvojene vnose v vrsti. Različni URL-ji lahko še vedno kažejo na isti fizični posrednik ali izhod; namerno jih združite, če mora izključnost veljati za ta skupni vir. Vrsta usklajuje niti v tem procesu, ne delavcev na drugih strojih.