Python axınları arasında proxy hovuzunu növbə ilə paylaşın
Sinxronlaşdırılmış növbə və finally blokundan istifadə edərək sinxron axın əməliyyatı üçün bir proxy ayırın və sonra geri qaytarın.
Bir neçə axın kiçik bir proxy hovuzunu paylaşdıqda, təsadüfi bir girişin seçilməsi iki aktiv əməliyyata eyni proxy verə bilər. Növbə hazırda borc götürmək üçün mövcud olan girişləri saxlaya bilər:
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)
Növbəni işçi axınları başlatmadan əvvəl bir dəfə qurun. proxy_urls tam son nöqtə URL-lərini ehtiva edir. İctimai namizədlər pulsuz proxy siyahısında mövcuddur; fetch_one-un dəstəklədiyi protokolu və URL formatını istifadə edin. Mövcud sinxron fetch_one funksiyası qayıtmazdan əvvəl şəbəkə əməliyyatını bitirməli və hər hansı cavabı bağlamalıdır. Əks halda, bağlantı hələ də həmin proxydən istifadə edərkən icarə bitəcək.
Queue.get mövcud bir girişi atomik olaraq çıxarır. Tükənmiş hovuz paylaşılan bayraqları təkrar-təkrar skan etmək əvəzinə gözləyir. Beş saniyə ərzində heç bir giriş gəlməzsə, queue.Empty çağırana çatır; bu nəticə üçün tətbiqin yenidən cəhd, uğursuzluq və ya ləğv siyasətini seçin.
finally bloku uğurdan və ya istisnadan sonra alınmış girişi qaytarır. Uğursuz son nöqtənin sağlam olduğunu bildirmir. Karantin, dəyişdirmə və soyutma siyasətləri müvəqqəti xəta görən hər proxyni səssizcə atmaq əvəzinə açıq bir yol tələb edir.
Eyni URL sətirlərinin təkrarlanmasının aradan qaldırılması dublikat növbə girişlərinin qarşısını alır. Fərqli URL-lər yenə də eyni fiziki proxyyə və ya çıxışa işarə edə bilər; əgər eksklüzivlik həmin paylaşılan resursa tətbiq olunmalıdırsa, onları qəsdən qruplaşdırın. Növbə bu prosesdəki axınları əlaqələndirir, digər maşınlardakı işçiləri yox.