কিউ ব্যৱহাৰ কৰি Python থ্ৰেডবোৰৰ মাজত প্ৰক্সি পুল শেয়াৰ কৰক
ছিংক্ৰ’নাইজড কিউ আৰু finally ব্লক ব্যৱহাৰ কৰি এটা ছিংক্ৰ’নাছ থ্ৰেডেড অপাৰেশ্যনৰ বাবে এটা প্ৰক্সি সংৰক্ষিত কৰি পিছত ঘূৰাই দিয়ক।
যেতিয়া কেইবাটাও থ্ৰেডে এটা সৰু প্ৰক্সি পুল শেয়াৰ কৰে, তেতিয়া এটা ৰেণ্ডম এণ্ট্ৰি বাছনি কৰিলে দুটা সক্ৰিয় অপাৰেশ্যনক একেই প্ৰক্সি দিব পাৰে। এটা কিউৱে এতিয়া ধাৰ কৰিবলৈ উপলব্ধ এণ্ট্ৰিবোৰ ৰাখিব পাৰে:
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)
কৰ্মী থ্ৰেড আৰম্ভ কৰাৰ আগতে কিউটো এবাৰ নিৰ্মাণ কৰক। proxy_urls ত সম্পূৰ্ণ এণ্ডপইণ্ট URL আছে। ৰাজহুৱা প্ৰাৰ্থী বিনামূলীয়া প্ৰক্সি তালিকাত উপলব্ধ; fetch_one এ সমৰ্থন কৰা প্ৰ’ট’কল আৰু URL ফৰ্মেট ব্যৱহাৰ কৰক। বৰ্তমানৰ ছিংক্ৰ’নাছ fetch_one ফাংচনে ঘূৰি অহাৰ আগতে ইয়াৰ নেটৱৰ্ক অপাৰেশ্যন শেষ কৰি যিকোনো সঁহাৰি বন্ধ কৰিব লাগিব। নহ’লে সংযোগে এতিয়াও সেই প্ৰক্সি ব্যৱহাৰ কৰি থকাৰ সময়তে লীজ শেষ হ’ব।
Queue.get এ এটা উপলব্ধ এণ্ট্ৰি পাৰমাণৱিকভাৱে আঁতৰায়। এটা শেষ হোৱা পুলে বাৰে বাৰে শেয়াৰ কৰা ফ্লেগ স্কেন কৰাৰ পৰিৱৰ্তে অপেক্ষা কৰে। যদি পাঁচ ছেকেণ্ডৰ ভিতৰত কোনো এণ্ট্ৰি নাহে, queue.Empty কলেৰ ওচৰ পায়; সেই ফলাফলৰ বাবে এপ্লিকেশ্যনৰ ৰিট্ৰাই, বিফলতা বা বাতিল নীতি বাছনি কৰক।
finally ব্লকে সফলতা বা এটা ব্যতিক্ৰমৰ পিছত এটা অধিগ্ৰহণ কৰা এণ্ট্ৰি ঘূৰাই দিয়ে। ই বিফল এণ্ডপইণ্টক সুস্থ বুলি ঘোষণা নকৰে। কোৱাৰেণ্টাইন, প্ৰতিস্থাপন আৰু কুলডাউন নীতিবোৰৰ বাবে এটা স্পষ্ট পথ প্ৰয়োজন, অস্থায়ী ত্ৰুটি দেখা প্ৰতিটো প্ৰক্সি নীৰৱে পেলাই দিয়াৰ পৰিৱৰ্তে।
একেই URL ষ্ট্ৰিংবোৰ ডিডুপ্লিকেট কৰিলে প্ৰতিলিপি কিউ এণ্ট্ৰি প্ৰতিৰোধ হয়। পৃথক URL এতিয়াও একেই ভৌতিক প্ৰক্সি বা এক্সিটক নিৰ্দেশ কৰিব পাৰে; যদি সেই শেয়াৰ কৰা সম্পদত একচেটিয়াতা প্ৰয়োগ কৰিব লাগে তেন্তে সেইবোৰ ইচ্ছাকৃতভাৱে গোটাওক। কিউৱে এই প্ৰক্ৰিয়াত থ্ৰেডবোৰ সমন্বয় কৰে, অন্য মেচিনৰ কৰ্মীক নহয়।