Thu thập từng kết quả từ các yêu cầu proxy urllib3 đồng thời
Chia sẻ một ProxyManager đã cấu hình giữa các luồng công nhân, tiêu thụ trình lặp kết quả của bộ thực thi và phân biệt việc giữ lại trong nhóm với giới hạn kết nối.
Tạo một nhóm công nhân không trao cho bên gọi các trang đã tải xuống. Hãy giữ và tiêu thụ các giá trị mà công việc đã gửi trả về:
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()Đoạn này giả định danh sách URL có giới hạn và kích thước phản hồi thông thường. Đối với các kiểm tra URL công khai được phép mà không cần xác thực proxy, một ứng viên từ danh sách proxy HTTP có thể thay thế điểm cuối HTTP mẫu của trình quản lý. Mỗi kết quả bao gồm URL của nó để bên gọi có thể liên kết trạng thái và nội dung với yêu cầu đúng. map trả về kết quả theo thứ tự đầu vào; ngoại lệ trong một công nhân được ném ra khi kết quả đó được lấy.
ProxyManager đã cấu hình sở hữu nhóm kết nối cho các yêu cầu. Với chế độ phản hồi tải trước mặc định được dùng ở đây, urllib3 đọc nội dung và trả kết nối về nhóm của nó. Một phiên bản phát trực tuyến sẽ cần tiêu thụ rõ ràng và giải phóng kết nối.
maxsize thường kiểm soát các kết nối có thể tái sử dụng được giữ lại, không phải giới hạn cứng cho mọi socket đã mở. block=True thay đổi hành vi nhóm liên quan để bên gọi chờ một kết nối trống thay vì mở thêm vượt giới hạn của nhóm đó.
Số lượng công nhân giới hạn các cuộc gọi đồng thời trong ví dụ này. Với nhiều đích đến, cách bố trí nhóm và tuyến đường dùng cho đường hầm HTTPS cũng quan trọng; không nên mô tả cài đặt của một nhóm như một hạn ngạch socket toàn cầu cho mọi máy chủ.