เมื่อหลายเธรดแชร์พูลพร็อกซีขนาดเล็ก การเลือกเรกคอร์ดแบบสุ่มอาจทำให้สองการทำงานที่ทำงานอยู่ได้พร็อกซีตัวเดียวกัน คิวสามารถเก็บเรกคอร์ดที่พร้อมให้ยืมในขณะนี้:

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

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