Khi nhiều luồng dùng chung một nhóm proxy nhỏ, việc chọn ngẫu nhiên một mục có thể khiến hai thao tác đang hoạt động nhận cùng một proxy. Hàng đợi có thể giữ các mục hiện có sẵn để mượn:

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)

Hãy dựng hàng đợi một lần, trước khi khởi động các luồng làm việc. proxy_urls chứa URL điểm cuối đầy đủ. Các ứng viên công khai có trong danh sách proxy miễn phí; dùng giao thức và định dạng URL mà fetch_one hỗ trợ. Hàm fetch_one đồng bộ hiện có phải hoàn tất thao tác mạng và đóng mọi phản hồi trước khi trả về. Nếu không, việc cho mượn sẽ kết thúc khi kết nối vẫn còn dùng proxy đó.

Queue.get loại bỏ một mục có sẵn một cách nguyên tử. Nhóm đã cạn sẽ chờ thay vì quét lặp lại các cờ dùng chung. Nếu không có mục nào đến trong năm giây, queue.Empty sẽ đến chỗ bên gọi; hãy chọn chính sách thử lại, thất bại hoặc hủy của ứng dụng cho kết quả đó.

Khối finally trả lại một mục đã lấy sau khi thành công hoặc sau ngoại lệ. Nó không tuyên bố rằng một điểm cuối thất bại là khỏe mạnh. Các chính sách cách ly, thay thế và làm nguội cần một đường đi rõ ràng thay vì âm thầm loại bỏ mọi proxy gặp lỗi tạm thời.

Loại bỏ trùng lặp các chuỗi URL giống nhau ngăn các mục hàng đợi bị nhân đôi. Các URL khác nhau vẫn có thể trỏ tới cùng một proxy vật lý hoặc lối ra; hãy nhóm chúng có chủ đích nếu tính độc quyền phải áp dụng cho tài nguyên dùng chung đó. Hàng đợi điều phối các luồng trong tiến trình này, không phải các worker trên máy khác.

Bài viết liên quan