प्रत्येक 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 के लिए नया सीमित प्रयास बनाना चाहिए। साझा सूची से प्रविष्टियाँ हटाने वाले पुनरावर्ती पुनःप्रयास कॉल से बचें: कोई अन्य श्रमिक उससे चयन कर रहा हो सकता है, और समाप्त सूची को अभी भी स्पष्ट परिणाम चाहिए।