যখন একাধিক থ্রেড একটি ছোট প্রক্সি পুল শেয়ার করে, তখন এলোমেলো এন্ট্রি নির্বাচন করলে দুটি সক্রিয় অপারেশন একই প্রক্সি পেতে পারে। একটি কিউ বর্তমানে ধার নেওয়ার জন্য উপলব্ধ এন্ট্রিগুলি ধরে রাখতে পারে:

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 রয়েছে। পাবলিক প্রার্থীরা বিনামূল্যের প্রক্সি তালিকা-তে পাওয়া যায়; fetch_one যে প্রোটোকল ও URL ফরম্যাট সমর্থন করে তা ব্যবহার করুন। বিদ্যমান সিঙ্ক্রোনাস fetch_one ফাংশনকে ফিরে আসার আগে তার নেটওয়ার্ক অপারেশন শেষ করতে হবে এবং যেকোনো প্রতিক্রিয়া বন্ধ করতে হবে। অন্যথায় লিজ শেষ হয়ে যাবে যখন সংযোগটি এখনও সেই প্রক্সি ব্যবহার করছে।

Queue.get প্যারমাণবিকভাবে একটি উপলব্ধ এন্ট্রি সরিয়ে দেয়। নিঃশেষিত পুল বারবার শেয়ার্ড ফ্ল্যাগ স্ক্যান না করে অপেক্ষা করে। যদি পাঁচ সেকেন্ডের মধ্যে কোনো এন্ট্রি না আসে, queue.Empty কলকারীর কাছে পৌঁছায়; সেই ফলাফলের জন্য অ্যাপ্লিকেশনের পুনরায় চেষ্টা, ব্যর্থতা বা বাতিল নীতি বেছে নিন।

finally ব্লক সফলতা বা ব্যতিক্রমের পরে অধিগ্রহণকৃত এন্ট্রি ফেরত দেয়। এটি ঘোষণা করে না যে ব্যর্থ এন্ডপয়েন্ট সুস্থ। কোয়ারেন্টাইন, প্রতিস্থাপন ও কুলডাউন নীতির জন্য স্পষ্ট পথ প্রয়োজন, অস্থায়ী ত্রুটি দেখা প্রতিটি প্রক্সি নীরবে বর্জন করার পরিবর্তে।

অভিন্ন URL স্ট্রিং ডিডুপ্লিকেট করলে সদৃশ কিউ এন্ট্রি প্রতিরোধ হয়। ভিন্ন URL এখনও একই ভৌত প্রক্সি বা এক্সিট নির্দেশ করতে পারে; যদি সেই শেয়ার্ড সম্পদে একচেটিয়াতা প্রযোজ্য হয় তবে সেগুলি ইচ্ছাকৃতভাবে গোষ্ঠীবদ্ধ করুন। কিউ এই প্রক্রিয়ার থ্রেডগুলি সমন্বয় করে, অন্যান্য মেশিনের কর্মীদের নয়।

সম্পর্কিত নিবন্ধ