Երբ մի քանի թելեր կիսում են փոքր պրոքսի լողավազան, պատահական գրառում ընտրելը կարող է երկու ակտիվ գործողությունների տալ նույն պրոքսին։ Հերթը կարող է պահել այն գրառումները, որոնք այժմ հասանելի են փոխառելու համար։

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)

Կառուցեք հերթը մեկ անգամ՝ աշխատանքային թելերը սկսելուց առաջ։ proxy_urls-ը պարունակում է վերջնակետերի ամբողջական URL-ներ։ Հանրային թեկնածուները հասանելի են անվճար պրոքսիների ցանկում․ օգտագործեք այն արձանագրությունն ու URL ձևաչափը, որոնք աջակցում է fetch_one-ը։ Գոյություն ունեցող սինխրոն fetch_one ֆունկցիան պետք է ավարտի իր ցանցային գործողությունը և փակի ցանկացած պատասխան մինչև վերադառնալը։ Հակառակ դեպքում վարձակալությունը կավարտվի, մինչ կապը դեռ օգտագործում է այդ պրոքսին։

Queue.get-ը ատոմար կերպով հեռացնում է մեկ հասանելի գրառում։ Սպառված լողավազանը սպասում է՝ փոխանակ կրկին ու կրկին սկանավորելու ընդհանուր դրոշները։ Եթե հինգ վայրկյանի ընթացքում գրառում չժամանի, queue.Empty-ը հասնում է կանչողին․ այդ արդյունքի համար ընտրեք հավելվածի կրկնափորձի, ձախողման կամ չեղարկման քաղաքականությունը։

finally բլոկը վերադարձնում է ձեռք բերված գրառումը հաջողությունից կամ բացառությունից հետո։ Այն չի հայտարարում, որ ձախողված վերջնակետը առողջ է։ Կարանտինի, փոխարինման և սառեցման քաղաքականությունները պահանջում են բացահայտ ուղի՝ ժամանակավոր սխալ տեսնող յուրաքանչյուր պրոքսի լռելյայն դեն նետելու փոխարեն։

Նույն URL տողերի կրկնօրինակների հեռացումը կանխում է հերթի կրկնակի գրառումները։ Տարբեր URL-ներ դեռ կարող են վերաբերել նույն ֆիզիկական պրոքսիին կամ ելքին․ խմբավորեք դրանք դիտավորյալ, եթե բացառիկությունը պետք է կիրառվի այդ ընդհանուր ռեսուրսի վրա։ Հերթը համակարգում է այս գործընթացի թելերը, ոչ թե այլ մեքենաների աշխատողներին։

Առնչվող հոդվածներ