Kai kelios gijos dalijasi mažu tarpinių serverių telkiniu, atsitiktinio įrašo pasirinkimas gali dviem aktyvioms operacijoms duoti tą patį tarpinį serverį. Eilė gali laikyti įrašus, kuriuos šiuo metu galima pasiskolinti:

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)

Sukurkite eilę vieną kartą, prieš paleisdami darbines gijas. proxy_urls turi pilnus galinių taškų URL. Vieši kandidatai prieinami nemokamų tarpinių serverių sąraše; naudokite protokolą ir URL formatą, kuriuos palaiko fetch_one. Esama sinchroninė fetch_one funkcija turi baigti tinklo operaciją ir uždaryti bet kurį atsakymą prieš grįždama. Priešingu atveju paskola pasibaigtų, kol ryšys dar naudoja tą tarpinį serverį.

Queue.get atomiškai pašalina vieną prieinamą įrašą. Išsekęs telkinys laukia, o ne pakartotinai nuskaito bendrus požymius. Jei per penkias sekundes įrašas neatvyksta, queue.Empty pasiekia kvietėją; pasirinkite programos kartojimo, gedimo arba atšaukimo politiką tam rezultatui.

finally blokas grąžina įsigytą įrašą po sėkmės arba išimties. Jis neskelbia, kad nepavykęs galinis taškas yra sveikas. Karantino, pakeitimo ir atvėsinimo politikoms reikia aiškaus kelio, o ne tyliai išmesti kiekvieną tarpinį serverį, kuris pamato laikiną klaidą.

Vienodų URL eilučių dubliavimo pašalinimas apsaugo nuo dubliuotų eilės įrašų. Skirtingi URL vis tiek gali nurodyti tą patį fizinį tarpinį serverį arba išėjimą; sugrupuokite juos sąmoningai, jei išskirtinumas turi būti taikomas tam bendram ištekliui. Eilė koordinuoja šio proceso gijas, o ne darbuotojus kitose mašinose.

Susiję straipsniai