PoolTimeout reiškia, kad HTTPX negavo ryšio iš telkinio per nustatytą laukimo laiką. Tai neįrodo, kad baigėsi naujo TCP ryšio su tarpiniu serveriu skirtasis laikas. Antra užklausa vis dar gali laukti jūsų proceso viduje.

Tai lengva atkurti, kai klientas leidžia vieną ryšį, o pirmas srautinis atsakymas paliekamas atviras. Kitos užklausos paleidimas to ryšio savaime neatlaisvina.

Aiškiai parodykite atsakomybę už srautinį atsakymą

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)

Prieš vykdydami pakeiskite dokumentacijos tarpinio serverio adresą. Kita užklausa prasideda išėjus iš srauto konteksto. Išėjimas uždaro atsakymą net jei kodas nutraukia ciklą ar sukelia išimtį.

Naudojant rankinį srautinį režimą, pvz., client.send(request, stream=True), už galutinį uždarymą atsako jūsų kodas. AsyncClient atveju atitinkamo rankinio išvalymo laukiama su response.aclose(). Uždarius neskaitytą atsakymą atlaisvinama talpa, bet gali reikėti atmesti pagrindinį ryšį užuot jį panaudojus pakartotinai.

Skaitykite išimties pavadinimą

ConnectTimeout susijęs su ryšio užmezgimu. ReadTimeout susijęs su atsakymo duomenų laukimu. PoolTimeout susijęs su ryšio vietos gavimu. Vien įrašas «tarpinio serverio laiko pabaiga» praranda skirtumą, būtiną taisymui parinkti.

Prieš keisdami galinių taškų IP patikrinkite atvirus atsakymus, lygiagrečias užduotis ir ryšių ribas. Didesnis telkinys gali tikti pagrįstai lygiagrečiai apkrovai, bet neištaiso niekada neuždaromų atsakymų. Jis tik suteikia programai daugiau užimamos talpos.

Išlaikykite klientą pakartotinai naudojamą per visą apkrovą. Kuriant jį iš naujo, kad kiekviena užklausa atrodytų veikianti, galima paslėpti gyvavimo ciklo problemą ir prarasti ryšių pakartotinį naudojimą.

Susiję straipsniai