避免在代理检查器中全局修改 urllib opener
让 urllib 代理探测停留在其自身的 opener 内,而不是替换整个进程的路由和超时默认设置。
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.当某条路由属于该探测时,请调用此 opener 自身的 open 方法。示例中的 HTTP 端点可能来自你的服务,也可能来自用于公共探测的 HTTP 代理列表。该片段只说明归属关系,并未定义完整的认证或健康检查策略。请将任何账号专属的 handler 绑定到预期的客户端。
urllib.request.install_opener() 会改变后续模块级 urlopen() 调用所使用的进程级默认值。因此,遍历代理的检查器可能让无关请求沿用其最后一个端点。临时安装并在清理时恢复,仍然允许并发请求在共享变更期间运行。
socket.setdefaulttimeout() 同样会改变之后创建的 socket 的默认值。当只有该探测需要时,请使用操作级超时。
关闭探测响应,并让结果保持具体:HTTP 错误响应并不自动意味着代理监听器已死。如果在异步服务中使用同步 urllib 探测,请把阻塞工作移到合适的 worker;这一执行决定并不能使全局 opener 变更变得隔离。
探测应返回其观测结果,而不留下另一套网络策略。它自身的客户端对象和受限操作使这一边界清晰可见。