Համօգտագործել պրոքսի լողավազանը Python թելերի միջև հերթով
Օգտագործեք համաժամեցված հերթ և finally բլոկ՝ սինխրոն թելային գործողության համար մեկ պրոքսի ամրագրելու և այն հետո վերադարձնելու համար։
Երբ մի քանի թելեր կիսում են փոքր պրոքսի լողավազան, պատահական գրառում ընտրելը կարող է երկու ակտիվ գործողությունների տալ նույն պրոքսին։ Հերթը կարող է պահել այն գրառումները, որոնք այժմ հասանելի են փոխառելու համար։
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-ներ դեռ կարող են վերաբերել նույն ֆիզիկական պրոքսիին կամ ելքին․ խմբավորեք դրանք դիտավորյալ, եթե բացառիկությունը պետք է կիրառվի այդ ընդհանուր ռեսուրսի վրա։ Հերթը համակարգում է այս գործընթացի թելերը, ոչ թե այլ մեքենաների աշխատողներին։