Python oqimlari o‘rtasida proksi hovuzini navbat bilan bo‘lishish
Sinxronlangan navbat va finally blokidan foydalanib, sinxron oqim amali uchun bitta proksini band qiling va keyin qaytaring.
Bir nechta oqim kichik proksi hovuzini bo‘lishganda, tasodifiy yozuvni tanlash ikkita faol amalga bir xil proksini berishi mumkin. Navbat hozir qarzga olish uchun mavjud yozuvlarni saqlashi mumkin:
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)
Navbatni ishchi oqimlarni boshlashdan oldin bir marta quring. proxy_urls to‘liq endpoint URL manzillarini o‘z ichiga oladi. Ommaviy nomzodlar bepul proksilar ro‘yxatida mavjud; fetch_one qo‘llab-quvvatlaydigan protokol va URL formatidan foydalaning. Mavjud sinxron fetch_one funksiyasi qaytishdan oldin tarmoq amalini tugatishi va har qanday javobni yopishi kerak. Aks holda ulanish hali ham o‘sha proksidan foydalanayotganda ijara tugaydi.
Queue.get bitta mavjud yozuvni atomik tarzda olib tashlaydi. Tugagan hovuz umumiy bayroqlarni qayta-qayta skanerlash o‘rniga kutadi. Agar besh soniya ichida yozuv kelmasa, queue.Empty chaqiruvchiga yetib boradi; bu natija uchun ilovaning qayta urinish, muvaffaqiyatsizlik yoki bekor qilish siyosatini tanlang.
finally bloki muvaffaqiyat yoki istisnodan keyin olingan yozuvni qaytaradi. U muvaffaqiyatsiz endpoint sog‘lom deb e’lon qilmaydi. Karantin, almashtirish va sovutish siyosatlari vaqtinchalik xatoni ko‘rgan har bir proksini jimgina tashlab yuborish o‘rniga aniq yo‘lni talab qiladi.
Bir xil URL satrlarining takrorlarini olib tashlash navbatda ikkilamchi yozuvlarning oldini oladi. Turli URL manzillar baribir bir xil jismoniy proksiga yoki chiqishga ishora qilishi mumkin; agar eksklyuzivlik o‘sha umumiy resursga qo‘llanishi kerak bo‘lsa, ularni ataylab guruhlang. Navbat bu jarayondagi oqimlarni muvofiqlashtiradi, boshqa mashinalardagi ishchilarni emas.