PoolTimeout betyder att HTTPX inte kunde få en anslutning ur poolen inom den konfigurerade väntetiden. Det bevisar inte att en ny TCP-anslutning till proxyn fick timeout. Den andra begäran kanske fortfarande väntar inne i processen.

Det blir lätt att återskapa när klienten tillåter en anslutning och det första strömmande svaret lämnas öppet. Att starta en ny begäran frigör inte den anslutningen av sig självt.

Gör ansvaret för strömmande svar synligt

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)

Byt ut dokumentationens proxyadress före körning. Nästa begäran börjar efter att strömmens kontext har lämnats. Det stänger svaret även om koden bryter loopen eller kastar ett undantag.

Vid manuell strömning, som client.send(request, stream=True), ansvarar din kod för att till sist stänga svaret. För AsyncClient inväntas motsvarande manuella städning med response.aclose(). Att stänga ett oläst svar frigör kapacitet men kan kräva att den underliggande anslutningen kastas i stället för att återanvändas.

Läs undantagets namn

ConnectTimeout gäller anslutningsetablering. ReadTimeout gäller väntan på svarsdata. PoolTimeout gäller att få en anslutningsplats. Att bara logga «proxytimeout» tappar skillnaden som behövs för att välja en lösning.

Kontrollera öppna svar, samtidiga uppgifter och anslutningsgränser innan du byter slutpunkternas IP-adresser. En större pool kan passa en legitim samtidig belastning men rättar inte till svar som aldrig stängs. Den ger bara programmet mer kapacitet att uppta.

Behåll klienten återanvändbar under hela arbetsbelastningen. Att skapa om klienten för att få varje begäran att verka fungera kan dölja ett livscykelproblem och förlora återanvändningen av anslutningar.

Relaterade artiklar