عندما تشترك عدة خيوط في مجموعة بروكسي صغيرة، فإن اختيار عنصر عشوائي قد يمنح عمليتين نشطتين البروكسي نفسه. يمكن لقائمة انتظار أن تحتفظ بالعناصر المتاحة للاستعارة حاليًا:

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 كاملة لنقاط النهاية. المرشحات العامة متاحة في قائمة البروكسي المجاني؛ استخدم البروتوكول وتنسيق URL الذي يدعمه fetch_one. يجب أن تُنهي دالة fetch_one المتزامنة الحالية عمليتها الشبكية وتغلق أي استجابة قبل أن تعود. وإلا سينتهي الإيجار بينما الاتصال ما زال يستخدم ذلك البروكسي.

يزيل Queue.get عنصرًا متاحًا واحدًا بشكل ذري. المجموعة المستنفدة تنتظر بدلًا من مسح الأعلام المشتركة مرارًا. إذا لم يصل أي عنصر خلال خمس ثوانٍ، يصل queue.Empty إلى المستدعي؛ اختر سياسة إعادة المحاولة أو الفشل أو الإلغاء الخاصة بالتطبيق لتلك النتيجة.

تعيد كتلة finally العنصر المكتسب بعد النجاح أو بعد استثناء. وهي لا تعلن أن نقطة نهاية فاشلة سليمة. تحتاج سياسات الحجر والاستبدال والتهدئة إلى مسار صريح بدلًا من التخلص الصامت من كل بروكسي يرى خطأً مؤقتًا.

إزالة تكرار سلاسل URL المتطابقة تمنع إدخالات مكررة في قائمة الانتظار. قد تشير عناوين URL مختلفة إلى البروكسي المادي نفسه أو إلى مخرج واحد؛ اجمعها عن قصد إذا كان يجب أن ينطبق الحصر على ذلك المورد المشترك. تنسق قائمة الانتظار الخيوط في هذه العملية، لا العمال على أجهزة أخرى.

مقالات ذات صلة