HTTPX PoolTimeout no és un temps d’espera de connexió al proxy
Identifica l’espera al pool d’HTTPX i allibera les respostes en streaming abans de substituir un proxy que potser ni ha rebut una altra petició.
PoolTimeout vol dir que HTTPX no ha pogut obtenir una connexió del seu pool dins del temps d’espera configurat. No demostra que una nova connexió TCP al proxy hagi exhaurit el temps. La segona petició encara pot estar esperant dins del procés.
És fàcil reproduir-ho si el client permet una connexió i la primera resposta en streaming queda oberta. Iniciar una altra petició no allibera aquella connexió per art de màgia.
Deixa clara la responsabilitat sobre la resposta en 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)
Substitueix l’adreça de proxy de documentació abans d’executar-ho. La petició següent comença després de sortir del context de l’stream. La sortida tanca la resposta encara que el codi interrompi el bucle o llanci una excepció.
Amb streaming manual, com client.send(request, stream=True), el codi és responsable del tancament final. Per a AsyncClient, la neteja manual corresponent s’espera amb response.aclose(). Tancar una resposta sense llegir allibera capacitat, però pot obligar a descartar la connexió subjacent en lloc de reutilitzar-la.
Llegeix el nom de l’excepció
ConnectTimeout es refereix a establir la connexió. ReadTimeout es refereix a esperar dades de resposta. PoolTimeout es refereix a obtenir una plaça de connexió. Registrar només «timeout del proxy» perd la distinció necessària per triar una solució.
Revisa respostes obertes, tasques concurrents i límits de connexió abans de canviar les IP dels punts de connexió. Un pool més gran pot ser adequat per a una càrrega concurrent legítima, però no corregeix respostes que mai no es tanquen. Només dona a l’aplicació més capacitat per ocupar.
Conserva el client reutilitzable durant tota la càrrega. Reconstruir-lo perquè cada petició sembli funcionar pot amagar un problema de cicle de vida i perdre la reutilització de connexions.