Kiểm tra proxy bằng Python: vì sao Future.cancel() để các luồng tiếp tục chạy
Hiểu vì sao hủy các future đang chờ không dừng được các kiểm tra mạng đang hoạt động, và giới hạn một cuộc đua proxy mà không khẳng định nó chứng minh tình trạng của đích đến.
Một worker tìm thấy một proxy dùng được. Bạn trả về địa chỉ của nó, gọi cancel trên các future khác, và mong hoạt động mạng dừng lại. Có thể nó không dừng.
Một Future có thể bị hủy trước khi callable của nó bắt đầu. Khi một luồng đã thực thi một yêu cầu, việc hủy Future của nó không ngắt thao tác socket đó. Worker cần thao tác mạng có giới hạn và đường dọn dẹp riêng.
Tuổi thọ của executor cũng quan trọng. Rời khỏi ngữ cảnh ThreadPoolExecutor sẽ chờ công việc của nó hoàn tất. Tìm được một kết quả nhanh rồi chờ nhiều worker chậm có thể khiến tổng độ trễ của bên gọi trông hoàn toàn khác với độ trễ mà người thắng báo cáo.
Giới hạn cuộc đua trước khi bắt đầu
- Giới hạn số kiểm tra đồng thời thay vì gửi một danh sách công khai không giới hạn. Danh sách proxy miễn phí cung cấp ứng viên cho đầu vào của bộ kiểm tra, với giao thức của mỗi điểm cuối được giữ cho worker.
- Cho mỗi yêu cầu một chính sách kết nối và đọc phù hợp.
- Cho bên gọi một ngân sách quyết định tổng thể.
- Xác định ai xả hoặc đóng kết quả từ những worker sống lâu hơn quyết định.
Chờ một Future ít hơn không giống với việc làm yêu cầu nền tảng của nó ngắn hơn. Tương tự, bỏ kết quả không giải phóng ngay mọi tài nguyên mạng.
Kết quả thành công đầu tiên cũng chỉ là lần kiểm tra thành công đầu tiên. Nó có thể phụ thuộc vào lập lịch, các kết nối được lưu trong bộ nhớ đệm và đích kiểm tra cụ thể. Nó không chứng minh rằng điểm cuối là nhanh nhất toàn cầu hay nhiệm vụ thực sự sẽ thành công.
Thường thì một nhóm nhỏ được giữ lại với các quan sát gần đây đơn giản hơn là đua với toàn bộ danh sách trước mỗi lần tải xuống. Dùng kết quả của thao tác thực để cập nhật bản ghi, cùng với chính sách phục hồi có kiểm soát cho các lỗi. Việc kiểm tra trước nên xứng đáng với chi phí của nó thay vì nhân đôi mọi nhiệm vụ theo thói quen.