PoolTimeout oznacza, że HTTPX nie uzyskał połączenia z puli w ciągu skonfigurowanego czasu oczekiwania. Nie dowodzi przekroczenia czasu nowego połączenia TCP z proxy. Drugie żądanie może nadal czekać wewnątrz procesu.

Łatwo to odtworzyć, gdy klient dopuszcza jedno połączenie, a pierwsza odpowiedź strumieniowa pozostaje otwarta. Uruchomienie innego żądania nie zwalnia magicznie tego połączenia.

Jasno określ odpowiedzialność za odpowiedź strumieniową

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)

Przed uruchomieniem zastąp dokumentacyjny adres proxy. Następne żądanie zaczyna się po wyjściu z kontekstu strumienia. Wyjście zamyka odpowiedź nawet wtedy, gdy kod przerywa pętlę lub zgłasza wyjątek.

Przy ręcznym strumieniowaniu, takim jak client.send(request, stream=True), kod odpowiada za ostateczne zamknięcie. W AsyncClient na odpowiednie ręczne sprzątanie czeka się przez response.aclose(). Zamknięcie nieodczytanej odpowiedzi zwalnia pojemność, ale może wymagać odrzucenia bazowego połączenia zamiast ponownego użycia.

Czytaj nazwę wyjątku

ConnectTimeout dotyczy nawiązywania połączenia. ReadTimeout dotyczy oczekiwania na dane odpowiedzi. PoolTimeout dotyczy uzyskania miejsca na połączenie. Logowanie tylko «timeout proxy» traci rozróżnienie potrzebne do wyboru poprawki.

Sprawdź otwarte odpowiedzi, współbieżne zadania i limity połączeń przed zmianą IP punktów końcowych. Większa pula może być właściwa dla uzasadnionego równoległego obciążenia, ale nie naprawia odpowiedzi, które nigdy nie są zamykane. Daje aplikacji jedynie więcej pojemności do zajęcia.

Zachowaj klienta do ponownego użycia w całym obciążeniu. Odtwarzanie klienta, aby każde żądanie pozornie działało, może ukryć problem cyklu życia i pozbawić ponownego użycia połączeń.

Powiązane artykuły