සෑම Python ThreadPoolExecutor කාර්යයකට URL සහ proxy එකක් පවරන්න
Python ඉල්ලීම් කාර්යයක් ඉදිරිපත් කිරීමට පෙර proxy එකක් පවරන්න, කම්කරුවන් හවුල් වෙනස්වන තේරීම් තත්ත්වයක් සඳහා තරඟ කිරීමට ඉඩ දීම වෙනුවට.
pool එකක map කම්කරුවාට එක් වරකට එක් අයිතමයක් ලබා දෙයි. එම අයිතමය URL සහ තෝරාගත් proxy ඇතුළුව සම්පූර්ණ කාර්යයක් කරන්න, කම්කරුවා වෙනස්වන ගෝලීය ලැයිස්තුවකින් තම මාර්ගය අනුමාන නොකරන පරිදි.
පරිමිත urls සඳහා, වලංගු කළ proxy URL වල හිස් නොවන ලැයිස්තුවක් සපයන්න. පොදු HTTP අපේක්ෂකයින් HTTP proxy ලැයිස්තුව තුළ ඇත:
from concurrent.futures import ThreadPoolExecutor
from itertools import cycle
import requests
def fetch(job):
url, proxy_url = job
proxies = {"http": proxy_url, "https": proxy_url}
with requests.get(url, proxies=proxies, timeout=(5, 15)) as response:
response.raise_for_status()
return url, response.text
if not proxy_urls:
raise ValueError("No proxy endpoints were supplied")
jobs = zip(urls, cycle(proxy_urls))
with ThreadPoolExecutor(max_workers=5) as executor:
for url, body in executor.map(fetch, jobs):
handle_result(url, body)urls, proxy_urls සහ handle_result යෙදුම මගින් සපයනු ලැබේ. සම්බන්ධීකාරකය අන්ත ලක්ෂ්ය පුනරාවර්තන අනුපිළිවෙලකින් පවරයි; සෑම කම්කරුවෙකුටම එක් ස්ථිර යුගලයක් ලැබේ. ප්රතිඵල පුනරාවර්තනය කිරීම කම්කරුවන්ගේ ව්යතිරේක ද අනාවරණය කරයි.
කම්කරුවන් පස් දෙනෙකු සක්රීය කාර්යයන් සීමා කරයි, proxy එකකට සක්රීය කාර්යයන් නොවේ. ලැයිස්තුවේ අන්ත ලක්ෂ්ය දෙකක් තිබේ නම්, කාර්යයන් කිහිපයකට එකම අන්ත ලක්ෂ්යය එකවර භාවිත කළ හැක. අවශ්ය විට එක් එක් අන්ත ලක්ෂ්යය සඳහා වෙනම ධාරිතා නියමයක් එක් කරන්න. එක් එක් අන්ත ලක්ෂ්ය URL සඳහා එක් සක්රීය කාර්යයක් සඳහා, සමමුහුර්ත පෝලිම් බදුදීම හට එක් එක් සටහන වෙන් කර නැවත ලබා දිය හැක.
නැවත උත්සාහය එම URL සඳහා නව සීමිත උත්සාහයක් සෑදිය යුතුය. හවුල් ලැයිස්තුවකින් සටහන් ඉවත් කරන පුනරාවර්තන නැවත-උත්සාහ ඇමතුම් වළක්වන්න: තවත් කම්කරුවෙකු එයින් තෝරමින් සිටිය හැක, සහ හිස් වූ ලැයිස්තුවකට තවමත් පැහැදිලි ප්රතිඵලයක් අවශ්යයි.