HTTPX PoolTimeout không phải hết thời gian kết nối tới proxy
Nhận biết việc chờ trong pool HTTPX và giải phóng phản hồi streaming trước khi thay proxy có thể chưa hề nhận yêu cầu tiếp theo.
PoolTimeout nghĩa là HTTPX không lấy được kết nối từ pool trong thời gian chờ đã cấu hình. Nó không chứng minh kết nối TCP mới tới proxy đã hết thời gian. Yêu cầu thứ hai có thể vẫn chờ bên trong tiến trình của bạn.
Điều này dễ tái hiện khi client chỉ cho phép một kết nối và phản hồi streaming đầu tiên bị để mở. Bắt đầu yêu cầu khác không tự giải phóng kết nối đó.
Làm rõ trách nhiệm với phản hồi streaming
import httpx
limits = httpx.Limits(
max_connections=1,
max_keepalive_connections=1,
)
timeout = httpx.Timeout(
connect=5, read=10, write=10, pool=1
)
with httpx.Client(
proxy="http://203.0.113.10:8080",
trust_env=False,
limits=limits,
timeout=timeout,
) as client:
with client.stream("GET", "https://example.com/") as response:
print(response.status_code)
for chunk in response.iter_bytes():
print(len(chunk))
next_response = client.get("https://example.com/")
print(next_response.status_code)
Thay địa chỉ proxy tài liệu trước khi chạy. Yêu cầu tiếp theo bắt đầu sau khi thoát ngữ cảnh stream. Việc thoát đóng phản hồi ngay cả khi mã ngắt vòng lặp hoặc phát sinh ngoại lệ.
Với streaming thủ công, như client.send(request, stream=True), mã của bạn chịu trách nhiệm đóng cuối cùng. Với AsyncClient, thao tác dọn thủ công tương ứng được chờ bằng response.aclose(). Đóng phản hồi chưa đọc giải phóng dung lượng, nhưng có thể phải bỏ kết nối bên dưới thay vì tái sử dụng.
Đọc tên ngoại lệ
ConnectTimeout liên quan đến thiết lập kết nối. ReadTimeout liên quan đến chờ dữ liệu phản hồi. PoolTimeout liên quan đến lấy chỗ kết nối. Chỉ ghi «proxy timeout» sẽ mất phân biệt cần thiết để chọn cách sửa.
Kiểm tra phản hồi đang mở, tác vụ đồng thời và giới hạn kết nối trước khi đổi IP điểm kết nối. Pool lớn hơn có thể phù hợp tải đồng thời hợp lý, nhưng không sửa phản hồi không bao giờ đóng. Nó chỉ cho ứng dụng thêm dung lượng để chiếm.
Giữ client có thể tái sử dụng xuyên suốt khối lượng công việc. Tạo lại client để từng yêu cầu có vẻ hoạt động có thể che vấn đề vòng đời và mất khả năng tái sử dụng kết nối.