HTTPX PoolTimeout není timeout připojení k proxy
Rozpoznejte čekání ve fondu HTTPX a uvolňujte streamované odpovědi, než vyměníte proxy, která možná vůbec nedostala další požadavek.
PoolTimeout znamená, že HTTPX nezískal spojení z fondu během nastavené doby čekání. Není to důkaz timeoutu nového TCP spojení k proxy. Druhý požadavek může stále čekat uvnitř vašeho procesu.
To se snadno reprodukuje, když klient povoluje jedno spojení a první streamovaná odpověď zůstane otevřená. Spuštění dalšího požadavku toto spojení samo neuvolní.
Zviditelněte odpovědnost za streamovanou odpověď
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)
Před spuštěním nahraďte dokumentační adresu proxy. Další požadavek začíná po opuštění kontextu streamu. Tento odchod zavře odpověď, i když kód opustí smyčku nebo vyvolá výjimku.
Při ručním streamování, například client.send(request, stream=True), odpovídá váš kód za konečné zavření. U AsyncClient se na odpovídající ruční úklid čeká pomocí response.aclose(). Zavření nepřečtené odpovědi uvolní kapacitu, ale může vyžadovat zahození podkladového spojení namísto jeho opětovného použití.
Čtěte název výjimky
ConnectTimeout se týká navazování spojení. ReadTimeout se týká čekání na data odpovědi. PoolTimeout se týká získání místa pro spojení. Zápis pouhého «timeout proxy» ztrácí rozlišení potřebné k volbě nápravy.
Než vyměníte IP koncových bodů, zkontrolujte otevřené odpovědi, souběžné úlohy a limity spojení. Větší fond může být vhodný pro oprávněnou souběžnou zátěž, ale neopraví odpovědi, které se nikdy nezavírají. Jen dává aplikaci více kapacity k obsazení.
Udržujte klienta znovu použitelným v rámci celé zátěže. Vytváření nového klienta, aby každý požadavek zdánlivě fungoval, může skrýt problém životního cyklu a zahodit opětovné využití spojení.