Το PoolTimeout σημαίνει ότι το HTTPX δεν πήρε σύνδεση από το pool μέσα στο ρυθμισμένο διάστημα αναμονής. Δεν αποδεικνύει λήξη χρονικού ορίου νέας σύνδεσης TCP στον proxy. Το δεύτερο αίτημα μπορεί ακόμη να περιμένει μέσα στη διεργασία σας.

Αυτό αναπαράγεται εύκολα όταν ο πελάτης επιτρέπει μία σύνδεση και η πρώτη απόκριση ροής μένει ανοιχτή. Η εκκίνηση άλλου αιτήματος δεν ελευθερώνει μαγικά αυτή τη σύνδεση.

Κάντε σαφή την ευθύνη για την απόκριση ροής

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)

Αντικαταστήστε τη διεύθυνση proxy τεκμηρίωσης πριν την εκτέλεση. Το επόμενο αίτημα αρχίζει μετά την έξοδο από το πλαίσιο της ροής. Η έξοδος κλείνει την απόκριση ακόμη και αν ο κώδικας διακόψει τον βρόχο ή προκαλέσει εξαίρεση.

Με χειροκίνητη ροή, όπως client.send(request, stream=True), ο κώδικάς σας ευθύνεται για το τελικό κλείσιμο. Για AsyncClient, η αντίστοιχη χειροκίνητη εκκαθάριση αναμένεται με response.aclose(). Το κλείσιμο αδιάβαστης απόκρισης ελευθερώνει χωρητικότητα, αλλά μπορεί να απαιτεί απόρριψη της υποκείμενης σύνδεσης αντί επαναχρησιμοποίησης.

Διαβάστε το όνομα της εξαίρεσης

Το ConnectTimeout αφορά την εγκατάσταση σύνδεσης. Το ReadTimeout αφορά την αναμονή δεδομένων απόκρισης. Το PoolTimeout αφορά την απόκτηση θέσης σύνδεσης. Η καταγραφή μόνο «proxy timeout» χάνει τη διάκριση που χρειάζεται για την επιλογή διόρθωσης.

Ελέγξτε ανοιχτές αποκρίσεις, ταυτόχρονες εργασίες και όρια συνδέσεων πριν αλλάξετε IP τελικών σημείων. Ένα μεγαλύτερο pool μπορεί να είναι κατάλληλο για εύλογο ταυτόχρονο φόρτο, αλλά δεν διορθώνει αποκρίσεις που δεν κλείνουν ποτέ. Δίνει απλώς στην εφαρμογή περισσότερη χωρητικότητα να δεσμεύσει.

Διατηρήστε τον πελάτη επαναχρησιμοποιήσιμο σε όλον τον φόρτο. Η αναδημιουργία του ώστε κάθε αίτημα να φαίνεται ότι λειτουργεί μπορεί να κρύψει πρόβλημα κύκλου ζωής και να χάσει την επαναχρησιμοποίηση συνδέσεων.

Σχετικά άρθρα