Kiam pluraj fadenoj kunhavigas malgrandan proksan provizon, elekti hazardan eron povas doni al du aktivaj operacioj la saman proksimon. Vico povas teni la erojn nuntempe disponeblajn por prunti:

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)

Konstruu la vicon unufoje, antaŭ ol starti la laborantajn fadenojn. proxy_urls enhavas plenajn finpunktojn URL. Publikaj kandidatoj disponeblas en la senpaga proksa listo; uzu la protokolon kaj URL-formon subtenatajn de fetch_one. La ekzistanta sinkrona funkcio fetch_one devas fini sian retan operacion kaj fermi ĉiun respondon antaŭ ol reveni. Alie la prunto finiĝus dum la konekto ankoraŭ uzas tiun proksimon.

Queue.get atome forigas unu disponeblan eron. Elĉerpita provizo atendas anstataŭ ripete skani komunajn flagojn. Se neniom da eroj alvenos ene de kvin sekundoj, queue.Empty atingos la alvokanton; elektu la retprov-, malsukces- aŭ nulig-politikon de la aplikaĵo por tiu rezulto.

La finally-bloko redonas akiritan eron post sukceso aŭ escepto. Ĝi ne deklaras, ke malsukcesa finpunkto estas sana. Kvarantenaj, anstataŭigaj kaj malvarmigaj politikoj bezonas eksplicitan vojon anstataŭ silente forĵeti ĉiun proksimon, kiu vidas provizoran eraron.

Malduobligi identajn URL-ĉenojn malhelpas duoblajn vicerojn. Malsamaj URL-oj ankoraŭ povas montri al la sama fizika proksimo aŭ eliro; grupigu ilin intence, se ekskluziveco devas validi por tiu komuna rimedo. La vico kunordigas fadenojn en ĉi tiu procezo, ne laborantojn sur aliaj maŝinoj.

Rilataj artikoloj