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 — до получаване на място за връзка. Записването само на «proxy timeout» губи разликата, нужна за избор на поправка.

Преди да сменяте IP адреси на крайни точки, проверете отворени отговори, едновременни задачи и ограниченията на връзките. По-голям пул може да е подходящ за оправдано едновременно натоварване, но не поправя отговори, които никога не се затварят. Само дава на приложението повече капацитет за заемане.

Запазете клиента за повторна употреба през натоварването. Създаването му наново, за да изглежда всяка заявка работеща, може да скрие проблем с жизнения цикъл и да премахне повторната употреба на връзки.

Подобни статии