Tránh thay đổi opener urllib toàn cục trong các trình kiểm tra proxy
Giữ các lần kiểm tra proxy bằng urllib trong opener riêng của chúng thay vì thay thế định tuyến và thời gian chờ mặc định của toàn bộ tiến trình.
from urllib.request import ProxyHandler, build_opener
def make_proxy_opener(proxy_uri):
return build_opener(ProxyHandler({
"http": proxy_uri,
"https": proxy_uri,
}))
opener = make_proxy_opener("http://proxy.example.net:8080")
# Use opener.open(destination, timeout=10) for this route.Gọi phương thức open riêng của opener này khi một tuyến thuộc về lần kiểm tra. Điểm cuối HTTP trong ví dụ có thể đến từ dịch vụ của bạn hoặc từ danh sách proxy HTTP cho các lần kiểm tra công khai. Đoạn mã minh họa quyền sở hữu; nó không định nghĩa chính sách xác thực hay sức khỏe đầy đủ. Giữ mọi handler riêng của tài khoản gắn với máy khách dự định.
urllib.request.install_opener() thay đổi mặc định toàn tiến trình mà các lệnh gọi urlopen() ở cấp mô-đun sau đó sử dụng. Vì vậy một trình kiểm tra chạy qua các proxy có thể để các yêu cầu không liên quan dùng điểm cuối cuối cùng của nó. Cài đặt tạm thời và khôi phục khi dọn dẹp vẫn cho phép các yêu cầu đồng thời chạy trong lúc thay đổi dùng chung.
socket.setdefaulttimeout() cũng thay đổi mặc định cho các socket được tạo sau đó. Dùng thời gian chờ ở cấp thao tác khi chỉ lần kiểm tra mới nên nhận nó.
Đóng các phản hồi kiểm tra và giữ kết quả cụ thể: phản hồi lỗi HTTP không tự động là một trình lắng nghe proxy đã chết. Nếu một lần kiểm tra urllib đồng bộ được dùng trong dịch vụ bất đồng bộ, hãy chuyển công việc gây chặn sang worker phù hợp; quyết định thực thi đó không làm cho thay đổi opener toàn cục trở nên tách biệt.
Một lần kiểm tra nên trả lại quan sát của nó mà không để lại một chính sách mạng khác phía sau. Đối tượng máy khách riêng và thao tác có giới hạn của nó làm rõ ranh giới đó.