HTTPX PoolTimeout nije istek vremena veze s proxyjem
Prepoznajte čekanje u HTTPX skupu veza i oslobodite streaming odgovore prije zamjene proxyja koji možda nije primio novi zahtjev.
PoolTimeout znači da HTTPX nije dobio vezu iz skupa unutar postavljenog vremena čekanja. To nije dokaz isteka vremena nove TCP veze s proxyjem. Drugi zahtjev možda još čeka unutar vašeg procesa.
To je lako ponoviti kada klijent dozvoljava jednu vezu, a prvi streaming odgovor ostane otvoren. Pokretanje drugog zahtjeva ne oslobađa tu vezu samo od sebe.
Jasno pokažite odgovornost za streaming odgovor
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)
Zamijenite dokumentacijsku adresu proxyja prije pokretanja. Sljedeći zahtjev počinje nakon izlaska iz streaming konteksta. Izlazak zatvara odgovor čak i ako kod prekine petlju ili baci izuzetak.
Kod ručnog streaminga, kao što je client.send(request, stream=True), vaš kod odgovara za konačno zatvaranje. Za AsyncClient odgovarajuće ručno čišćenje čeka se pozivom response.aclose(). Zatvaranje nepročitanog odgovora oslobađa kapacitet, ali može zahtijevati odbacivanje osnovne veze umjesto ponovne upotrebe.
Pročitajte naziv izuzetka
ConnectTimeout odnosi se na uspostavu veze. ReadTimeout odnosi se na čekanje podataka odgovora. PoolTimeout odnosi se na dobivanje mjesta za vezu. Zapisivanje samo «proxy timeout» gubi razliku potrebnu za odabir popravke.
Prije promjene IP-jeva krajnjih tačaka provjerite otvorene odgovore, konkurentne zadatke i granice veza. Veći skup može odgovarati opravdanom istovremenom opterećenju, ali ne popravlja odgovore koji se nikad ne zatvaraju. Samo daje aplikaciji više kapaciteta za zauzimanje.
Zadržite klijent za ponovnu upotrebu kroz cijelo opterećenje. Ponovno stvaranje klijenta kako bi svaki zahtjev izgledao uspješan može sakriti problem životnog ciklusa i izgubiti ponovnu upotrebu veza.