HTTPX PoolTimeout bukan timeout koneksi ke proxy
Kenali penantian di pool HTTPX dan bebaskan respons streaming sebelum mengganti proxy yang mungkin belum menerima permintaan berikutnya.
PoolTimeout berarti HTTPX tidak mendapat koneksi dari pool dalam waktu tunggu yang diatur. Ini bukan bukti timeout pada koneksi TCP baru ke proxy. Permintaan kedua mungkin masih menunggu di dalam proses Anda.
Ini mudah direproduksi ketika klien mengizinkan satu koneksi dan respons streaming pertama dibiarkan terbuka. Memulai permintaan lain tidak otomatis membebaskan koneksi itu.
Perjelas tanggung jawab atas respons 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)
Ganti alamat proxy dokumentasi sebelum menjalankan. Permintaan berikutnya dimulai setelah keluar dari konteks stream. Keluar dari konteks menutup respons meski kode memutus perulangan atau memunculkan pengecualian.
Pada streaming manual, seperti client.send(request, stream=True), kode Anda bertanggung jawab atas penutupan akhirnya. Untuk AsyncClient, pembersihan manual yang sesuai ditunggu dengan response.aclose(). Menutup respons yang belum dibaca membebaskan kapasitas, tetapi mungkin mengharuskan koneksi dasarnya dibuang alih-alih dipakai kembali.
Baca nama pengecualiannya
ConnectTimeout berkaitan dengan pembentukan koneksi. ReadTimeout berkaitan dengan menunggu data respons. PoolTimeout berkaitan dengan memperoleh slot koneksi. Hanya mencatat «timeout proxy» menghilangkan perbedaan yang diperlukan untuk memilih perbaikan.
Periksa respons terbuka, tugas bersamaan, dan batas koneksi sebelum mengganti IP endpoint. Pool yang lebih besar bisa sesuai untuk beban bersamaan yang sah, tetapi tidak memperbaiki respons yang tidak pernah ditutup. Ini hanya memberi aplikasi lebih banyak kapasitas untuk ditempati.
Pertahankan klien agar bisa dipakai kembali selama beban kerja. Membuat ulang klien agar setiap permintaan tampak berfungsi bisa menyembunyikan masalah siklus hidup dan menghilangkan penggunaan ulang koneksi.