პროქსი პულის გაზიარება 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 შეიცავს სრულ endpoint URL-ებს. საჯარო კანდიდატები ხელმისაწვდომია უფასო პროქსიების სიაში; გამოიყენეთ ის პროტოკოლი და URL ფორმატი, რომელსაც fetch_one მხარს უჭერს. არსებულმა სინქრონულმა fetch_one ფუნქციამ დაბრუნებამდე უნდა დაასრულოს ქსელური ოპერაცია და დახუროს ნებისმიერი პასუხი. წინააღმდეგ შემთხვევაში იჯარა დასრულდება, სანამ კავშირი ჯერ კიდევ იყენებს ამ პროქსის.
Queue.get ატომურად შლის ერთ ხელმისაწვდომ ჩანაწერს. ამოწურული პული ელოდება, ნაცვლად იმისა, რომ განმეორებით დაასკანიროს საერთო დროშები. თუ ხუთ წამში ჩანაწერი არ მოვა, queue.Empty მოუწვდება გამომძახებელს; ამ შედეგისთვის აირჩიეთ აპლიკაციის ხელახალი ცდის, წარუმატებლობის ან გაუქმების პოლიტიკა.
finally ბლოკი აბრუნებს მიღებულ ჩანაწერს წარმატების ან გამონაკლისის შემდეგ. ის არ აცხადებს, რომ წარუმატებელი endpoint ჯანსაღია. კარანტინის, ჩანაცვლებისა და გაგრილების პოლიტიკებს სჭირდება აშკარა გზა, ნაცვლად იმისა, რომ ჩუმად გადაყაროს ყოველი პროქსი, რომელიც დროებით შეცდომას ხედავს.
იდენტური URL სტრიქონების დედუპლიკაცია ხელს უშლის რიგში ორმაგ ჩანაწერებს. სხვადასხვა URL მაინც შეიძლება მიუთითებდეს ერთსა და იმავე ფიზიკურ პროქსიზე ან გასასვლელზე; დაჯგუფეთ ისინი განზრახ, თუ ექსკლუზიურობა უნდა ვრცელდებოდეს ამ საერთო რესურსზე. რიგი ამ პროცესის ნაკადებს აკოორდინირებს და არა სხვა მანქანების მუშებს.