जेव्हा अनेक थ्रेड्स एक छोटा प्रॉक्सी पूल शेअर करतात, तेव्हा यादृच्छिक नोंद निवडल्यास दोन सक्रिय ऑपरेशन्सना एकच प्रॉक्सी मिळू शकतो. 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 आहेत. सार्वजनिक उमेदवार मोफत प्रॉक्सी सूचीमध्ये उपलब्ध आहेत; fetch_one जे प्रोटोकॉल आणि URL स्वरूप समर्थित करते ते वापरा. विद्यमान सिंक्रोनस fetch_one फंक्शनने परत येण्यापूर्वी त्याचे नेटवर्क ऑपरेशन पूर्ण करून कोणताही प्रतिसाद बंद करावा. अन्यथा कनेक्शन अजून त्या प्रॉक्सीचा वापर करत असतानाच लीज संपेल.

Queue.get एक उपलब्ध नोंद अणुप्रमाणे काढून टाकते. संपलेला पूल वारंवार सामायिक फ्लॅग स्कॅन करण्याऐवजी थांबतो. पाच सेकंदांत कोणतीही नोंद न आल्यास queue.Empty कॉलरपर्यंत पोहोचते; त्या निकालासाठी अनुप्रयोगाचे पुनःप्रयत्न, अयशस्वी किंवा रद्द करण्याचे धोरण निवडा.

finally ब्लॉक यश किंवा अपवादानंतर मिळवलेली नोंद परत करतो. तो अयशस्वी endpoint निरोगी असल्याचे जाहीर करत नाही. क्वारंटाइन, बदली आणि कूलडाउन धोरणांना स्पष्ट मार्ग आवश्यक आहे, तात्पुरती त्रुटी पाहणारी प्रत्येक प्रॉक्सी शांतपणे टाकून देण्याऐवजी.

समान URL स्ट्रिंगची डुप्लिकेट काढून टाकल्यास queue मधील दुहेरी नोंदी टळतात. भिन्न URL अजूनही एकाच भौतिक प्रॉक्सी किंवा एग्झिटकडे निर्देश करू शकतात; त्या सामायिक संसाधनावर अनन्यता लागू करायची असल्यास त्या जाणीवपूर्वक गटबद्ध करा. queue या प्रक्रियेतील थ्रेड्सचे समन्वय करते, इतर मशीनवरील वर्करचे नाही.

संबंधित लेख