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

บทความที่เกี่ยวข้อง