一、连接超时错误的典型表现
当使用httpx的get()方法时,最常见的连接超时错误表现为:
- ConnectTimeout:建立TCP连接时超时(默认5秒)
- ReadTimeout:等待服务器响应时超时
- PoolTimeout:连接池资源耗尽时的等待超时
import httpx
try:
response = httpx.get('https://example.com')
except httpx.ConnectTimeout as e:
print(f"连接超时: {e}")
二、核心解决方案
1. 调整超时参数配置
通过timeout参数实现精细控制:
# 设置全局超时策略
timeout = httpx.Timeout(10.0, connect=5.0)
client = httpx.Client(timeout=timeout)
# 单次请求定制
response = httpx.get(
url,
timeout=httpx.Timeout(connect=3.0, read=15.0)
)
2. 代理服务器配置优化
当使用代理时需特别注意:
proxies = {
"http://": "http://proxy.example.com:8080",
"https://": "http://secureproxy.example.com:443"
}
response = httpx.get(
"https://target.com",
proxies=proxies,
timeout=30.0
)
3. DNS解析优化方案
使用自定义DNS解析器避免DNS超时:
import socket
from httpx import AsyncClient
async with AsyncClient(
limits=httpx.Limits(max_connections=100),
transport=httpx.AsyncHTTPTransport(
resolver=httpx.AsyncResolver(
socket.AF_INET,
nameservers=["8.8.8.8"]
)
)
) as client:
response = await client.get(url)
三、高级调试技巧
1. 网络层诊断工具
使用Wireshark或tcpdump抓包分析:
tcpdump -i any host example.com -w debug.pcap
2. HTTP流量日志
启用详细日志记录:
import logging
logging.basicConfig(level=logging.DEBUG)
四、性能优化建议
| 参数 | 推荐值 | 说明 |
|---|---|---|
| connect_timeout | 3-5秒 | TCP连接建立时间 |
| read_timeout | 30秒 | 等待响应时间 |
| pool_timeout | 10秒 | 连接池等待时间 |
五、异常处理最佳实践
建议采用分层异常处理策略:
try:
response = httpx.get(url, timeout=timeout)
except httpx.NetworkError as e:
# 网络层错误处理
logger.error(f"网络错误: {e}")
except httpx.TimeoutException as e:
# 超时专用处理
if isinstance(e, httpx.ConnectTimeout):
retry_connection()
elif isinstance(e, httpx.ReadTimeout):
fallback_to_cache()
except httpx.HTTPStatusError as e:
# HTTP状态码处理
handle_http_error(e.response.status_code)