รวบรวมทุกผลลัพธ์จากคำขอพร็อกซี urllib3 พร้อมกัน
แชร์ ProxyManager ที่กำหนดค่าแล้วระหว่างเธรดผู้ทำงาน ใช้ตัววนซ้ำผลลัพธ์ของผู้ดำเนินการ และแยกการเก็บรักษาพูลออกจากขีดจำกัดการเชื่อมต่อ
การสร้างพูลผู้ทำงานไม่ได้ส่งหน้าเว็บที่ดาวน์โหลดให้ผู้เรียก เก็บและใช้ค่าที่งานที่ส่งไปส่งคืน:
from concurrent.futures import ThreadPoolExecutor
import urllib3
manager = urllib3.ProxyManager(
'http://proxy.example:8080',
maxsize=4,
block=True,
)
def fetch(url):
response = manager.request(
'GET', url, timeout=urllib3.Timeout(connect=5, read=15),
)
return url, response.status, response.data
try:
with ThreadPoolExecutor(max_workers=4) as workers:
results = list(workers.map(fetch, urls))
finally:
manager.clear()ส่วนนี้ถือว่ามีรายการ URL ที่จำกัดและขนาดการตอบสนองปกติ สำหรับการตรวจสอบ URL สาธารณะที่ได้รับอนุญาตโดยไม่มีการรับรองความถูกต้องพร็อกซี ผู้สมัครจากรายการพร็อกซี HTTPสามารถแทนที่ปลายทาง HTTP ตัวอย่างของผู้จัดการได้ ทุกผลลัพธ์มี URL ของตนเพื่อให้ผู้เรียกเชื่อมโยงสถานะและเนื้อหากับคำขอที่ถูกต้องได้ map ส่งคืนผลลัพธ์ตามลำดับอินพุต ข้อยกเว้นในผู้ทำงานจะถูกโยนเมื่อดึงผลลัพธ์นั้น
ProxyManager ที่กำหนดค่าแล้วเป็นเจ้าของพูลการเชื่อมต่อสำหรับคำขอ ด้วยโหมดการตอบสนองที่โหลดล่วงหน้าเป็นค่าเริ่มต้นที่ใช้ที่นี่ urllib3 อ่านเนื้อหาและคืนการเชื่อมต่อกลับสู่พูลของตน เวอร์ชันสตรีมมิ่งจะต้องมีการบริโภคอย่างชัดเจนและการปล่อยการเชื่อมต่อ
maxsize โดยปกติควบคุมการเชื่อมต่อที่นำกลับมาใช้ซ้ำซึ่งเก็บไว้ ไม่ใช่ขีดจำกัดแข็งสำหรับทุกซ็อกเก็ตที่เปิด block=True เปลี่ยนพฤติกรรมพูลที่เกี่ยวข้องเพื่อให้ผู้เรียกรอการเชื่อมต่อว่างแทนที่จะเปิดเพิ่มเกินขีดจำกัดของพูลนั้น
จำนวนผู้ทำงานจำกัดการเรียกพร้อมกันในตัวอย่างนี้ เมื่อมีปลายทางจำนวนมาก การจัดวางพูลและเส้นทางที่ใช้สำหรับอุโมงค์ HTTPS ก็มีความสำคัญเช่นกัน ไม่ควรอธิบายการตั้งค่าของพูลเดียวว่าเป็นโควตาซ็อกเก็ตทั่วโลกหนึ่งรายการสำหรับทุกโฮสต์