PoolTimeout betekent dat HTTPX binnen de ingestelde wachttijd geen verbinding uit zijn pool kon krijgen. Het bewijst geen time-out van een nieuwe TCP-verbinding naar de proxy. Het tweede verzoek wacht mogelijk nog binnen je proces.

Dit is eenvoudig te reproduceren als een client één verbinding toestaat en het eerste streamingantwoord open blijft. Een volgend verzoek starten maakt die verbinding niet vanzelf vrij.

Maak het eigenaarschap van streamingantwoorden duidelijk

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)

Vervang het documentatieadres van de proxy voordat je dit uitvoert. Het volgende verzoek begint nadat de streamcontext is verlaten. Dat sluit het antwoord, ook als de code uit de lus springt of een uitzondering opwerpt.

Bij handmatig streamen, zoals client.send(request, stream=True), is je code verantwoordelijk voor het uiteindelijke sluiten. Bij AsyncClient wacht je op de overeenkomstige handmatige opruiming met response.aclose(). Een ongelezen antwoord sluiten maakt capaciteit vrij, maar kan vereisen dat de onderliggende verbinding wordt weggegooid in plaats van hergebruikt.

Lees de naam van de uitzondering

ConnectTimeout betreft het opzetten van een verbinding. ReadTimeout betreft wachten op antwoordgegevens. PoolTimeout betreft het verkrijgen van een verbindingsplek. Alleen «proxytime-out» loggen verliest het onderscheid dat nodig is om een oplossing te kiezen.

Controleer open antwoorden, gelijktijdige taken en verbindingslimieten voordat je endpoint-IP’s vervangt. Een grotere pool kan passend zijn voor legitieme gelijktijdige belasting, maar verhelpt geen antwoorden die nooit worden gesloten. Het geeft de toepassing alleen meer capaciteit om bezet te houden.

Houd de client herbruikbaar voor de hele werklast. Een client opnieuw bouwen om elk verzoek te laten lijken te werken kan een levenscyclusprobleem verbergen en verbindingshergebruik opgeven.

Gerelateerde artikelen