प्रत्येक Python ThreadPoolExecutor कार्यमा URL र प्रोक्सी तोक्नुहोस्
Python अनुरोध कार्य पेश गर्नु अघि प्रोक्सी तोक्नुहोस्, कर्मचारीहरूलाई साझा परिवर्तनशील चयन स्थितिमा प्रतिस्पर्धा गर्न दिनुको सट्टा।
पूलको map ले एक पटकमा एउटा वस्तु कर्मचारीलाई दिन्छ। त्यो वस्तुलाई URL र छानिएको प्रोक्सी सहित पूर्ण कार्य बनाउनुहोस्, ताकि कर्मचारीले परिवर्तनशील विश्वव्यापी सूचीबाट आफ्नो मार्ग अनुमान नगरोस्।
सीमित urls का लागि, प्रमाणित प्रोक्सी URL को खाली नभएको सूची दिनुहोस्। सार्वजनिक HTTP उम्मेदवारहरू HTTP प्रोक्सी सूची मा उपलब्ध छन्:
from concurrent.futures import ThreadPoolExecutor
from itertools import cycle
import requests
def fetch(job):
url, proxy_url = job
proxies = {"http": proxy_url, "https": proxy_url}
with requests.get(url, proxies=proxies, timeout=(5, 15)) as response:
response.raise_for_status()
return url, response.text
if not proxy_urls:
raise ValueError("No proxy endpoints were supplied")
jobs = zip(urls, cycle(proxy_urls))
with ThreadPoolExecutor(max_workers=5) as executor:
for url, body in executor.map(fetch, jobs):
handle_result(url, body)urls, proxy_urls र handle_result अनुप्रयोगले प्रदान गर्छ। समन्वयकले अन्त्य बिन्दुहरू दोहोरिने क्रममा तोक्छ; प्रत्येक कर्मचारीले एउटा निश्चित जोडी पाउँछ। नतिजाहरू दोहोर्याउँदा कर्मचारीका अपवादहरू पनि देखिन्छन्।
पाँच कर्मचारीले सक्रिय कार्यहरू सीमित गर्छन्, प्रति प्रोक्सी सक्रिय कार्यहरू होइन। यदि सूचीमा दुई अन्त्य बिन्दु छन् भने, धेरै कार्यहरूले एउटै अन्त्य बिन्दु एकै समयमा प्रयोग गर्न सक्छन्। आवश्यक पर्दा प्रति अन्त्य बिन्दु छुट्टै क्षमता नियम थप्नुहोस्। प्रति अन्त्य बिन्दु URL एक सक्रिय कार्यका लागि, सिङ्क्रोनाइज्ड क्यू भाडा ले प्रत्येक प्रविष्टि आरक्षित गरेर फर्काउन सक्छ।
पुनःप्रयासले उही URL का लागि नयाँ सीमित प्रयास सिर्जना गर्नुपर्छ। साझा सूचीबाट प्रविष्टिहरू हटाउने पुनरावर्ती पुनःप्रयास कलहरूबाट बच्नुहोस्: अर्को कर्मचारी त्यसबाट चयन गर्दै हुन सक्छ, र सकिएको सूचीलाई अझै स्पष्ट नतिजा चाहिन्छ।