Ένα ProxyAgent μπορεί να συνδεθεί γρήγορα και μετά να περιμένει επ' αόριστον ένα σώμα απόκρισης. Το χρονικό όριο σύνδεσης του endpoint του proxy δεν περιγράφει αυτή τη μεταγενέστερη αναμονή.

Ορίστε ένα όριο σύνδεσης στο endpoint όταν χτίζετε τον agent. Για το δημόσιο αίτημα HTTP παρακάτω, ένας μη πιστοποιημένος υποψήφιος από τη λίστα proxy HTTP μπορεί να αντικαταστήσει τη διεύθυνση, εφόσον επιτρέπονται δημόσιοι μεσολαβητές:

endpoint = TCP4ClientEndpoint(reactor, 'proxy.example', 8080,
                              timeout=5)
agent = ProxyAgent(endpoint, reactor=reactor)

Για μια μικρή απόκριση που σκοπεύετε να συλλέξετε στη μνήμη, εντάξτε την ανάγνωση του σώματος στην αλυσίδα Deferred πριν προσθέσετε την προθεσμία:

from twisted.web.client import readBody

d = agent.request(b'GET', b'http://example.com/')
d.addCallback(readBody)
d.addTimeout(10, reactor)
d.addCallback(lambda body: print(len(body)))
d.addErrback(lambda failure: print(failure.getErrorMessage()))

Το απόσπασμα προϋποθέτει ότι η εφαρμογή έχει ήδη τον reactor και έναν ρυθμισμένο agent. Το Deferred του αιτήματος του ProxyAgent δίνει ένα αντικείμενο απόκρισης· το readBody επιστρέφει το Deferred για το σώμα. Η επιστροφή του από το callback κάνει την αλυσίδα να περιμένει και αυτή την εργασία.

Η θέση έχει σημασία. Το Twisted εφαρμόζει το addTimeout στην εργασία που αντιπροσωπεύουν τα callbacks που εγκαταστάθηκαν πριν από αυτό. Μια ανάγνωση σώματος που προστίθεται μετά θα περιέγραφε διαφορετικό όριο. Σε αυτή τη διάταξη το χρονόμετρο ξεκινά όταν καλείται το addTimeout και καλύπτει το αίτημα που εκκρεμεί και την εργασία του σώματος σε αυτή την αλυσίδα.

Χρησιμοποιήστε καταναλωτή ροής για μεγάλα ή απεριόριστα σώματα και αναπαραστήστε την ολοκλήρωσή του με τον ίδιο τρόπο. Μια προθεσμία στην πλευρά του πελάτη περιορίζει πόσο περιμένει η εφαρμογή σας· δεν επαναρυθμίζει το δικό του χρονικό όριο σύνδεσης του proxy προς τα πάνω.

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