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.

Artikli relatati