समवर्ती urllib3 प्रॉक्सी अनुरोधों से हर परिणाम एकत्र करें
वर्कर थ्रेड्स के बीच कॉन्फ़िगर किया गया ProxyManager साझा करें, executor के परिणाम इटरेटर का उपभोग करें और पूल प्रतिधारण को कनेक्शन सीमा से अलग करें।
वर्कर पूल बनाने से कॉलर को डाउनलोड किए गए पेज नहीं मिलते। सबमिट किए गए काम से लौटाए गए मान रखें और उनका उपभोग करें:
from concurrent.futures import ThreadPoolExecutor
import urllib3
manager = urllib3.ProxyManager(
'http://proxy.example:8080',
maxsize=4,
block=True,
)
def fetch(url):
response = manager.request(
'GET', url, timeout=urllib3.Timeout(connect=5, read=15),
)
return url, response.status, response.data
try:
with ThreadPoolExecutor(max_workers=4) as workers:
results = list(workers.map(fetch, urls))
finally:
manager.clear()यह अंश सीमित URL सूची और सामान्य प्रतिक्रिया आकार मानता है। प्रॉक्सी प्रमाणीकरण के बिना अनुमत सार्वजनिक-URL जाँचों के लिए HTTP प्रॉक्सी सूची से एक उम्मीदवार प्रबंधक के उदाहरण HTTP एंडपॉइंट को बदल सकता है। हर परिणाम में उसका URL शामिल होता है ताकि कॉलर स्थिति और बॉडी को सही अनुरोध से जोड़ सके। map परिणाम इनपुट क्रम में लौटाता है; किसी वर्कर में अपवाद तब उठाया जाता है जब वह परिणाम प्राप्त किया जाता है।
कॉन्फ़िगर किया गया ProxyManager अनुरोधों के लिए कनेक्शन पूलिंग का स्वामी है। यहाँ उपयोग किए गए डिफ़ॉल्ट पूर्व-लोडेड प्रतिक्रिया मोड के साथ, urllib3 बॉडी पढ़ता है और कनेक्शन अपने पूल में लौटाता है। स्ट्रीमिंग संस्करण को स्पष्ट उपभोग और कनेक्शन मुक्ति की आवश्यकता होगी।
maxsize सामान्यतः बनाए रखे गए पुन: प्रयोग योग्य कनेक्शन नियंत्रित करता है, हर खुले सॉकेट पर कठोर सीमा नहीं। block=True संबंधित पूल व्यवहार बदलता है ताकि कॉलर उस पूल की सीमा से अधिक अतिरिक्त खोलने के बजाय मुक्त कनेक्शन की प्रतीक्षा करें।
इस उदाहरण में वर्कर संख्या समवर्ती कॉल सीमित करती है। कई गंतव्यों के साथ, पूल लेआउट और HTTPS सुरंगों के लिए उपयोग किया गया मार्ग भी मायने रखते हैं; किसी एक पूल की सेटिंग को हर होस्ट के लिए एक वैश्विक सॉकेट कोटा के रूप में नहीं बताया जाना चाहिए।