সমবর্তী urllib3 প্রক্সি অনুরোধ থেকে প্রতিটি ফলাফল সংগ্রহ করুন
কর্মী থ্রেডের মধ্যে একটি কনফিগার করা ProxyManager শেয়ার করুন, এক্সিকিউটরের ফলাফল ইটারেটর ব্যবহার করুন এবং পুল ধরে রাখাকে সংযোগ সীমা থেকে আলাদা করুন।
কর্মী পুল তৈরি করলে কলকারী ডাউনলোড করা পৃষ্ঠাগুলো পায় না। জমা দেওয়া কাজ যে মানগুলো ফেরত দেয় সেগুলো ধরে রাখুন ও ব্যবহার করুন:
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 টানেলের জন্য ব্যবহৃত পথও গুরুত্বপূর্ণ; একটি পুলের সেটিংকে প্রতিটি হোস্টের জন্য একটি বিশ্বব্যাপী সকেট কোটা হিসেবে বর্ণনা করা উচিত নয়।