Kui mitu lõime jagavad väikest proksivahemikku, võib juhusliku kirje valimine anda kahele aktiivsele toimingule sama proksi. Järjekord võib hoida kirjeid, mis on praegu laenamiseks saadaval:

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)

Koostage järjekord üks kord enne töölõimede käivitamist. proxy_urls sisaldab täielikke lõpp-punkti URL-e. Avalikud kandidaadid on saadaval tasuta prokside loendis; kasutage protokolli ja URL-vormingut, mida fetch_one toetab. Olemasolev sünkroonne funktsioon fetch_one peab enne tagasipöördumist oma võrgutoimingu lõpetama ja kõik vastused sulgema. Vastasel juhul lõpeks laen, kui ühendus kasutab veel seda proksit.

Queue.get eemaldab aatomiliselt ühe saadaoleva kirje. Ammendunud vahemik ootab, selle asemel et korduvalt jagatud lippe skaneerida. Kui kirje ei saabu viie sekundi jooksul, jõuab queue.Empty kutsujani; valige selle tulemuse jaoks rakenduse uuestiproovimise, ebaõnnestumise või tühistamise poliitika.

Finally-plokk tagastab omandatud kirje pärast õnnestumist või erandit. See ei väida, et ebaõnnestunud lõpp-punkt on terve. Karantiini-, asendamis- ja jahtumispoliitikad vajavad selgesõnalist teed, selle asemel et vaikselt kõrvale heita iga proksi, mis näeb ajutist viga.

Identsete URL-stringide dubleerimise eemaldamine hoiab ära topeltjärjekorra kirjed. Erinevad URL-id võivad endiselt viidata samale füüsilisele proksile või väljundile; rühmitage need teadlikult, kui eksklusiivsus peab kehtima sellele jagatud ressursile. Järjekord koordineerib lõimi selles protsessis, mitte töötajaid teistel masinatel.

Seotud artiklid