Thread များစွာသည် proxy pool ငယ်တစ်ခုကို မျှဝေသောအခါ ကျပန်းထည့်သွင်းမှုကို ရွေးချယ်ခြင်းက လုပ်ဆောင်ချက်နှစ်ခုကို တူညီသော proxy ပေးနိုင်သည်။ 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)

အလုပ်သမား thread များ မစတင်မီ queue ကို တစ်ကြိမ်တည်ဆောက်ပါ။ proxy_urls တွင် ပြည့်စုံသော endpoint URL များ ပါဝင်သည်။ အများသူငှာ ကိုယ်စားလှယ်လောင်းများကို အခမဲ့ proxy စာရင်းတွင် ရရှိနိုင်သည်။ fetch_one ပံ့ပိုးသော protocol နှင့် URL ပုံစံကို အသုံးပြုပါ။ လက်ရှိ synchronous fetch_one လုပ်ဆောင်ချက်သည် ပြန်မလာမီ ၎င်း၏ ကွန်ရက်လုပ်ဆောင်ချက်ကို ပြီးစီးပြီး မည်သည့်တုံ့ပြန်မှုကိုမဆို ပိတ်ရမည်။ သို့မဟုတ်ပါက ချိတ်ဆက်မှုက ထို proxy ကို အသုံးပြုနေစဉ် ငှားရမ်းမှု ကုန်ဆုံးသွားမည်။

Queue.get သည် ရရှိနိုင်သော ထည့်သွင်းမှုတစ်ခုကို atomic အနေဖြင့် ဖယ်ရှားသည်။ ကုန်သွားသော pool သည် မျှဝေထားသော အလံများကို ထပ်ခါတလဲလဲ စကင်ဖတ်မည့်အစား စောင့်ဆိုင်းသည်။ ငါးစက္ကန့်အတွင်း မည်သည့်ထည့်သွင်းမှုမျှ မရောက်ပါက queue.Empty သည် ခေါ်သူထံ ရောက်ရှိမည်။ ထိုရလဒ်အတွက် အပလီကေးရှင်း၏ ပြန်ကြိုးစားမှု၊ မအောင်မြင်မှု သို့မဟုတ် ပယ်ဖျက်မှု မူဝါဒကို ရွေးချယ်ပါ။

finally block သည် အောင်မြင်မှု သို့မဟုတ် ခြွင်းချက်တစ်ခုပြီးနောက် ရယူထားသော ထည့်သွင်းမှုကို ပြန်ပေးသည်။ မအောင်မြင်သော endpoint သည် ကျန်းမာသည်ဟု မကြေညာပါ။ Quarantine၊ အစားထိုးမှုနှင့် အအေးခံမှု မူဝါဒများသည် ယာယီအမှားတွေ့သော proxy တိုင်းကို တိတ်ဆိတ်စွာ လွှင့်ပစ်မည့်အစား ရှင်းလင်းသော လမ်းကြောင်း လိုအပ်သည်။

တူညီသော URL စာကြောင်းများကို ထပ်နေမှုဖယ်ရှားခြင်းက queue တွင် နှစ်ဆထည့်သွင်းမှုများကို တားဆီးသည်။ မတူညီသော URL များသည် တူညီသော ရုပ်ပိုင်းဆိုင်ရာ proxy သို့မဟုတ် ထွက်ပေါက်ကို ရည်ညွှန်းနိုင်သေးသည်။ ထိုမျှဝေအရင်းအမြစ်အပေါ် သီးသန့်ဖြစ်မှု သက်ရောက်ရမည်ဆိုပါက ၎င်းတို့ကို တမင်တကာ အုပ်စုဖွဲ့ပါ။ Queue သည် ဤလုပ်ငန်းစဉ်အတွင်းရှိ thread များကို ညှိနှိုင်းသည်၊ အခြားစက်များရှိ အလုပ်သမားများကို မဟုတ်ပါ။

ဆက်စပ်ဆောင်းပါးများ