PoolTimeout азначае, што HTTPX не атрымаў злучэнне з пула за наладжаны час чакання. Гэта не даказвае тайм-аўту новага TCP-злучэння з проксі. Другі запыт можа яшчэ чакаць унутры вашага працэсу.

Гэта лёгка паўтарыць, калі кліент дазваляе адно злучэнне, а першы струменевы адказ застаецца адкрытым. Запуск іншага запыту не вызваляе злучэнне сам па сабе.

Яўна пазначце адказнасць за струменевы адказ

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)

Перад запускам замяніце дакументацыйны адрас проксі. Наступны запыт пачынаецца пасля выхаду з кантэксту патоку. Выхад закрывае адказ нават пры спыненні цыклу або выключэнні.

Пры ручным струменевым рэжыме, напрыклад client.send(request, stream=True), за канчатковае закрыццё адказвае ваш код. У AsyncClient адпаведную ручную ачыстку чакаюць праз response.aclose(). Закрыццё непрачытанага адказу вызваляе ёмістасць, але можа запатрабаваць адкінуць базавае злучэнне замест паўторнага выкарыстання.

Чытайце назву выключэння

ConnectTimeout датычыцца ўсталявання злучэння. ReadTimeout — чакання даных адказу. PoolTimeout — атрымання месца для злучэння. Запіс толькі «тайм-аўт проксі» губляе адрозненне, патрэбнае для выбару выпраўлення.

Перш чым мяняць IP канцавых пунктаў, праверце адкрытыя адказы, паралельныя задачы і абмежаванні злучэнняў. Большы пул можа падыходзіць апраўданай паралельнай нагрузцы, але не выправіць адказы, якія ніколі не закрываюцца. Ён толькі дае праграме больш ёмістасці для заняцця.

Захоўвайце кліент для паўторнага выкарыстання на працягу нагрузкі. Перастварэнне кліента дзеля бачнай працаздольнасці кожнага запыту можа схаваць праблему жыццёвага цыклу і пазбавіць паўторнага выкарыстання злучэнняў.

Падобныя артыкулы