Python ThreadPoolExecutor-ийн ажил бүрт URL болон прокси оноох
Python хүсэлтийн ажлыг илгээхийн өмнө прокси оноож, ажилчид хуваалцсан хувьсах сонголтын төлөө өрсөлдөх боломжийг бүү орхи.
Пүүлийн map нь ажилчинд нэг удаад нэг зүйл дамжуулдаг. Тэр зүйлийг URL болон сонгосон прокси орсон бүрэн ажил болгоорой, ингэснээр ажилчин хувьсах глобал жагсаалтаас замаа таамаглахгүй.
Хязгаарлагдмал urls-ийн хувьд баталгаажсан прокси URL-ын хоосон бус жагсаалт өгнө үү. Нийтийн HTTP нэр дэвшигчид HTTP прокси жагсаалтад-д боломжтой:
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-ыг програмын өөрөө өгдөг. Зохицуулагч төгсгөлийн цэгүүдийг давтагдах дарааллаар оноодог; ажилчин бүр нэг тогтмол хос авдаг. Үр дүнг давтах нь ажилчдын үл хамаарах зүйлийг ч илрүүлдэг.
Таван ажилчин идэвхтэй ажлыг хязгаарладаг, прокси тус бүрийн идэвхтэй ажлыг биш. Жагсаалтад хоёр төгсгөлийн цэг байвал хэд хэдэн ажил нэг цэгийг нэгэн зэрэг ашиглаж болно. Шаардлагатай үед төгсгөлийн цэг бүрт тусдаа хүчин чадлын дүрэм нэмнэ үү. Төгсгөлийн цэгийн URL бүрт нэг идэвхтэй ажлын хувьд синхрончлогдсон дарааллын түрээс бичлэг бүрийг захиалж, буцааж өгч чадна.
Дахин оролдлого нь ижил URL-д шинэ хязгаарлагдмал оролдлого үүсгэх ёстой. Хуваалцсан жагсаалтаас бичлэг устгадаг рекурсив дахин оролдлогын дуудлагаас зайлсхий: өөр ажилчин тэндээс сонгож байж болно, хасагдсан жагсаалт ч тодорхой үр дүн шаарддаг.