Kad vairāki pavedieni dala nelielu starpniekserveru kopu, nejaušas ieraksta izvēle var divām aktīvām darbībām piešķirt vienu un to pašu starpniekserveri. Rinda var turēt ierakstus, kas pašlaik ir pieejami aizņēmumam:

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)

Izveidojiet rindu vienu reizi, pirms darba pavedienu palaišanas. proxy_urls satur pilnus galapunktu URL. Publiskie kandidāti ir pieejami bezmaksas starpniekserveru sarakstā; izmantojiet protokolu un URL formātu, ko atbalsta fetch_one. Esošajai sinhronajai fetch_one funkcijai pirms atgriešanās jāpabeidz tīkla darbība un jāaizver jebkura atbilde. Pretējā gadījumā aizdevums beigtos, kamēr savienojums vēl izmanto šo starpniekserveri.

Queue.get atomiski noņem vienu pieejamu ierakstu. Izsmelta kopa gaida, nevis atkārtoti skenē koplietotos karodziņus. Ja piecu sekunžu laikā ieraksts neienāk, queue.Empty nonāk pie izsaucēja; izvēlieties programmas atkārtošanas, kļūmes vai atcelšanas politiku šim rezultātam.

finally bloks atgriež iegūto ierakstu pēc panākumiem vai izņēmuma. Tas nepaziņo, ka neizdevies galapunkts ir veselīgs. Karantīnas, aizstāšanas un atdzesēšanas politikām vajag skaidru ceļu, nevis klusi izmest katru starpniekserveri, kas saskaras ar īslaicīgu kļūdu.

Vienādu URL virkņu atkārtojumu noņemšana novērš dublētus rindas ierakstus. Dažādi URL joprojām var norādīt uz to pašu fizisko starpniekserveri vai izeju; grupējiet tos apzināti, ja ekskluzivitātei jāattiecas uz šo koplietoto resursu. Rinda koordinē šī procesa pavedienus, nevis darbiniekus citās mašīnās.

Saistītie raksti