กำหนด URL และพร็อกซีให้กับทุกงาน Python ThreadPoolExecutor
กำหนดพร็อกซีก่อนส่งงานคำขอ 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 เดียวกัน หลีกเลี่ยงการเรียกลองใหม่แบบเรียกซ้ำที่ลบรายการออกจากรายการที่ใช้ร่วมกัน: ผู้ปฏิบัติงานคนอื่นอาจกำลังเลือกจากรายการนั้น และรายการที่หมดแล้วยังต้องมีผลลัพธ์ที่ชัดเจน