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 ආධාරක වන ප්‍රොටෝකෝලය සහ URL ආකෘතිය භාවිතා කරන්න. පවතින සමමුහුර්ත fetch_one ශ්‍රිතය ආපසු පැමිණීමට පෙර එහි ජාල මෙහෙයුම අවසන් කර ඕනෑම ප්‍රතිචාරයක් වසා දැමිය යුතුය. නැතහොත් සම්බන්ධතාවය තවමත් එම proxy භාවිතා කරන අතරතුර බදු පැවරුම අවසන් වේ.

Queue.get ලබා ගත හැකි සටහනක් පරමාණුකව ඉවත් කරයි. හිස් වූ pool එක බෙදාගත් කොඩි නැවත නැවත පරිලෝකනය කරනවාට වඩා රැඳී සිටී. තත්පර පහක් තුළ කිසිදු සටහනක් නොපැමිණෙන්නේ නම්, queue.Empty ඇමතුම්කරු වෙත ළඟා වේ; එම ප්‍රතිඵලය සඳහා යෙදුමේ නැවත උත්සාහ, අසාර්ථකත්වය හෝ අවලංගු කිරීමේ ප්‍රතිපත්තිය තෝරන්න.

finally කොටස සාර්ථකත්වයෙන් හෝ ව්‍යතිරේකයකින් පසු ලබා ගත් සටහන ආපසු දෙයි. අසාර්ථක endpoint එකක් සුවපත් යැයි එය ප්‍රකාශ නොකරයි. නිරෝධායන, ප්‍රතිස්ථාපන සහ සිසිල් කිරීමේ ප්‍රතිපත්ති සඳහා පැහැදිලි මාර්ගයක් අවශ්‍ය වේ, තාවකාලික දෝෂයක් දකින සෑම proxy එකක්ම නිහඬව ඉවත නොදැමිය යුතුය.

සමාන URL තන්තු අනුපිටපත් ඉවත් කිරීම queue හි ද්විත්ව සටහන් වළක්වයි. වෙනස් URL තවමත් එකම භෞතික proxy එකක් හෝ පිටවීම වෙත යොමු විය හැකිය; එම බෙදාගත් සම්පත් සඳහා තනි අයිතිය අදාළ විය යුතු නම් ඒවා හිතාමතා කාණ්ඩගත කරන්න. queue මෙම ක්‍රියාවලියේ thread සම්බන්ධීකරණය කරයි, වෙනත් යන්ත්‍රවල කම්කරුවන් නොවේ.

අදාළ ලිපි