แชร์พูลพร็อกซีระหว่างเธรด Python ด้วยคิว
ใช้คิวที่ซิงโครไนซ์และบล็อก finally เพื่อจองพร็อกซีหนึ่งตัวสำหรับการทำงานแบบเธรดซิงโครนัสแล้วคืนกลับภายหลัง
เมื่อหลายเธรดแชร์พูลพร็อกซีขนาดเล็ก การเลือกเรกคอร์ดแบบสุ่มอาจทำให้สองการทำงานที่ทำงานอยู่ได้พร็อกซีตัวเดียวกัน คิวสามารถเก็บเรกคอร์ดที่พร้อมให้ยืมในขณะนี้:
from contextlib import contextmanager
from queue import Queue
available = Queue()
for endpoint in dict.fromkeys(proxy_urls):
available.put(endpoint)
@contextmanager
def borrow_proxy():
endpoint = available.get(timeout=5)
try:
yield endpoint
finally:
available.put(endpoint)
def process_url(url):
with borrow_proxy() as endpoint:
return fetch_one(url, endpoint)
สร้างคิวครั้งเดียวก่อนเริ่มเธรดผู้ทำงาน proxy_urls มี URL ปลายทางแบบเต็ม ผู้สมัครสาธารณะมีอยู่ในรายการพร็อกซีฟรี ใช้โปรโตคอลและรูปแบบ URL ที่ fetch_one รองรับ ฟังก์ชัน fetch_one แบบซิงโครนัสที่มีอยู่ต้องทำงานเครือข่ายให้เสร็จและปิดการตอบกลับใด ๆ ก่อนที่จะคืนค่า มิฉะนั้นการให้ยืมจะสิ้นสุดลงในขณะที่การเชื่อมต่อยังใช้พร็อกซีนั้นอยู่
Queue.get ลบเรกคอร์ดที่พร้อมใช้งานหนึ่งรายการอย่างเป็นอะตอม พูลที่หมดจะรอแทนที่จะสแกนแฟล็กที่แชร์ซ้ำ ๆ หากไม่มีเรกคอร์ดมาถึงภายในห้าวินาที queue.Empty จะไปถึงผู้เรียก เลือกนโยบายการลองใหม่ ความล้มเหลว หรือการยกเลิกของแอปพลิเคชันสำหรับผลลัพธ์นั้น
บล็อก finally คืนเรกคอร์ดที่ได้มาหลังจากสำเร็จหรือเกิดข้อยกเว้น ไม่ได้ประกาศว่าปลายทางที่ล้มเหลวนั้นแข็งแรง นโยบายการกักกัน การแทนที่ และการทำให้เย็นลงต้องมีเส้นทางที่ชัดเจน แทนที่จะทิ้งพร็อกซีทุกตัวที่พบข้อผิดพลาดชั่วคราวอย่างเงียบ ๆ
การลบสตริง URL ที่ซ้ำกันป้องกันเรกคอร์ดคิวซ้ำ URL ที่แตกต่างกันยังสามารถอ้างถึงพร็อกซีทางกายภาพเดียวกันหรือทางออกเดียวกัน จัดกลุ่มอย่างตั้งใจหากความเฉพาะเจาะจงต้องใช้กับทรัพยากรที่แชร์นั้น คิวประสานเธรดในกระบวนการนี้ ไม่ใช่ผู้ทำงานบนเครื่องอื่น