Aqsam pool ta' proksijiet bejn ħjieli Python b'kus
Uża kus sinkronizzat u blokka finally biex tirriżerva proksiju wieħed għal operazzjoni ta' ħajta sinkronika u terġa' lura wara.
Meta diversi ħjieli jaqsmu pool żgħir ta' proksijiet, l-għażla ta' entrata każwali tista' tagħti l-istess proksiju lil żewġ operazzjonijiet attivi. Kus jista' jżomm l-entrati li bħalissa huma disponibbli biex jissellfu:
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)
Ibni l-kus darba, qabel ma tibda l-ħjieli tax-xogħol. proxy_urls fih URL sħaħ tal-punt tat-tmiem. Kandidati pubbliċi huma disponibbli fil-lista tal-proksijiet bla ħlas; uża l-protokoll u l-format tal-URL li jappoġġja fetch_one. Il-funzjoni fetch_one sinkronika eżistenti trid tlesti l-operazzjoni tan-netwerk tagħha u tagħlaq kull risposta qabel ma terġa' lura. Inkella l-self jispiċċa waqt li l-konnessjoni għadha tuża dak il-proksiju.
Queue.get tneħħi entrata disponibbli waħda b'mod atomiku. Pool eżawrit jistenna minflok ma jiskennja ripetutament flag kondiviżi. Jekk ma tasal l-ebda entrata fi ħames sekondi, queue.Empty tasal għand min iċempel; agħżel il-politika ta' erġa' pprova, falliment jew kanċellazzjoni tal-applikazzjoni għal dak ir-riżultat.
Il-blokka finally tirritorna entrata akkwistata wara suċċess jew eċċezzjoni. Ma tiddikjarax li punt tat-tmiem fallut huwa f'saħħtu. Politiki ta' kwarantina, sostituzzjoni u tkessiħ jeħtieġu triq espliċita minflok ma jarmu bil-kwiet kull proksiju li jara żball temporanju.
It-tneħħija ta' duplikati ta' stringi URL identiċi tipprevjeni entrati doppji fil-kus. URL differenti xorta jistgħu jirreferu għall-istess proksiju fiżiku jew ħruġ; iġborhom deliberatament jekk l-esklużività trid tapplika għal dak ir-riżorsa kondiviża. Il-kus jikkoordina ħjieli f'dan il-proċess, mhux ħaddiema fuq magni oħra.