जब धेरै थ्रेडहरूले सानो प्रोक्सी पूल साझा गर्छन्, अनियमित प्रविष्टि छान्दा दुई सक्रिय अपरेसनलाई एउटै प्रोक्सी दिन सक्छ। 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 ले यो प्रक्रियाका थ्रेडहरू समन्वय गर्छ, अन्य मेसिनका कामदारहरू होइन।

सम्बन्धित लेखहरू