جب کئی تھریڈز ایک چھوٹا پراکسی پول شیئر کرتے ہیں، تو بے ترتیب اندراج منتخب کرنے سے دو فعال آپریشنز کو ایک ہی پراکسی مل سکتی ہے۔ queue اس وقت قرض لینے کے لیے دستیاب اندراجات رکھ سکتا ہے:

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)

ورکر تھریڈز شروع کرنے سے پہلے queue ایک بار بنائیں۔ proxy_urls میں مکمل endpoint URL ہیں۔ عوامی امیدوار مفت پراکسی فہرست میں دستیاب ہیں؛ وہ پروٹوکول اور URL فارمیٹ استعمال کریں جس کی fetch_one حمایت کرتا ہے۔ موجودہ ہم وقت ساز fetch_one فنکشن کو واپس آنے سے پہلے اپنا نیٹ ورک آپریشن مکمل کر کے کوئی بھی جواب بند کرنا چاہیے۔ ورنہ لیز اس وقت ختم ہو جائے گی جب کنکشن اب بھی وہ پراکسی استعمال کر رہا ہو۔

Queue.get ایک دستیاب اندراج کو جوہری طور پر ہٹاتا ہے۔ ختم شدہ پول بار بار مشترکہ جھنڈے اسکین کرنے کے بجائے انتظار کرتا ہے۔ اگر پانچ سیکنڈ میں کوئی اندراج نہ آئے تو queue.Empty کال کرنے والے تک پہنچتا ہے؛ اس نتیجے کے لیے ایپلیکیشن کی دوبارہ کوشش، ناکامی یا منسوخی کی پالیسی منتخب کریں۔

finally بلاک کامیابی یا استثنا کے بعد حاصل شدہ اندراج واپس کرتا ہے۔ یہ اعلان نہیں کرتا کہ ناکام endpoint صحت مند ہے۔ قرنطینہ، متبادل اور ٹھنڈک کی پالیسیوں کے لیے واضح راستہ درکار ہے، عارضی خرابی دیکھنے والی ہر پراکسی کو خاموشی سے پھینکنے کے بجائے۔

ایک جیسی URL تاروں کی نقل ہٹانا queue میں دوہرے اندراجات روکتا ہے۔ مختلف URL اب بھی ایک ہی طبعی پراکسی یا اخراج کی طرف اشارہ کر سکتے ہیں؛ اگر اس مشترکہ وسیلے پر خصوصیت لاگو ہونی چاہیے تو انہیں جان بوجھ کر گروہ بند کریں۔ queue اس عمل میں تھریڈز کو ہم آہنگ کرتا ہے، دوسری مشینوں کے ورکرز کو نہیں۔

متعلقہ مضامین