అనేక థ్రెడ్‌లు చిన్న ప్రాక్సీ పూల్‌ను పంచుకున్నప్పుడు, యాదృచ్ఛిక ఎంట్రీని ఎంచుకోవడం రెండు యాక్టివ్ ఆపరేషన్‌లకు ఒకే ప్రాక్సీని ఇవ్వవచ్చు. queue ప్రస్తుతం అప్పు తీసుకోవడానికి అందుబాటులో ఉన్న ఎంట్రీలను ఉంచగలదు:

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)

వర్కర్ థ్రెడ్‌లను ప్రారంభించే ముందు queueను ఒకసారి నిర్మించండి. proxy_urls పూర్తి endpoint URLలను కలిగి ఉంది. పబ్లిక్ అభ్యర్థులు ఉచిత ప్రాక్సీ జాబితాలో అందుబాటులో ఉన్నాయి; fetch_one మద్దతు ఇచ్చే ప్రోటోకాల్ మరియు URL ఫార్మాట్‌ను ఉపయోగించండి. ఇప్పటికే ఉన్న సింక్రోనస్ fetch_one ఫంక్షన్ తిరిగి రాకముందు తన నెట్‌వర్క్ ఆపరేషన్‌ను పూర్తి చేసి ఏదైనా ప్రతిస్పందనను మూసివేయాలి. లేకపోతే కనెక్షన్ ఇంకా ఆ ప్రాక్సీని ఉపయోగిస్తున్నప్పుడే లీజ్ ముగుస్తుంది.

Queue.get అందుబాటులో ఉన్న ఒక ఎంట్రీని పరమాణు పద్ధతిలో తొలగిస్తుంది. ఖాళీ అయిన పూల్ పంచుకున్న ఫ్లాగ్‌లను పదే పదే స్కాన్ చేయడం బదులు వేచి ఉంటుంది. ఐదు సెకన్లలో ఏ ఎంట్రీ రాకపోతే, queue.Empty కాలర్‌ను చేరుతుంది; ఆ ఫలితం కోసం అప్లికేషన్ రీట్రై, వైఫల్యం లేదా రద్దు విధానాన్ని ఎంచుకోండి.

finally బ్లాక్ విజయం లేదా మినహాయింపు తర్వాత పొందిన ఎంట్రీని తిరిగి ఇస్తుంది. విఫలమైన endpoint ఆరోగ్యకరమని అది ప్రకటించదు. క్వారంటైన్, భర్తీ మరియు కూల్‌డౌన్ విధానాలకు స్పష్టమైన మార్గం అవసరం, తాత్కాలిక లోపం చూసిన ప్రతి ప్రాక్సీని నిశ్శబ్దంగా విసిరేయడం బదులు.

ఒకే URL స్ట్రింగ్‌ల నకళ్లను తొలగించడం queueలో రెట్టింపు ఎంట్రీలను నిరోధిస్తుంది. వేర్వేరు URLలు ఇప్పటికీ ఒకే భౌతిక ప్రాక్సీ లేదా నిష్క్రమణను సూచించవచ్చు; ఆ పంచుకున్న వనరుపై ప్రత్యేకత వర్తించాలంటే వాటిని ఉద్దేశపూర్వకంగా సమూహపరచండి. queue ఈ ప్రక్రియలోని థ్రెడ్‌లను సమన్వయపరుస్తుంది, ఇతర యంత్రాలలోని వర్కర్‌లను కాదు.

సంబంధిత వ్యాసాలు