Wenn Sie auf den Sockel eingesetzt, um solche niedrigen Niveau Eigenschaft zugreifen müssen, werden Sie einige Objekte überlasten müssen.
Zuerst werden Sie eine Unterklasse von HTTPHandler erstellen müssen, dass in der Standardbibliothek tun:
class HTTPHandler(AbstractHTTPHandler):
def http_open(self, req):
return self.do_open(httplib.HTTPConnection, req)
http_request = AbstractHTTPHandler.do_request_
Wie Sie sehen können, ist es ein HTTPConnection
verwendete Verbindung zu öffnen ... Sie müssen um es auch zu überschreiben;) um die connect()
Methode zu aktualisieren.
So etwas sollte ein guter Anfang sein:
class LowLevelHTTPConnection(httplib.HTTPConnection):
def connect(self):
httplib.HTTPConnection.connect(self)
self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
class LowLevelHTTPHandler(HTTPHandler):
def http_open(self, req):
return self.do_open(LowLevelHTTPConnection, req)
urllib2 intelligent genug, um Ihnen zu erlauben, einige Handler zu Unterklasse und dann verwenden, wird die urllib2.build_opener dafür gemacht:
urllib2.install_opener(urllib2.build_opener(LowLevelHTTPHandler)) # tell urllib2 to use your HTTPHandler in replacement of the standard HTTPHandler
httpRequest = urllib2.Request("http:/www....com")
pageContent = urllib2.urlopen(httpRequest)
pageContent.readline()
Warum legen Sie es beim Aufruf eines Webservers fest ??? – jgauffin
Ich besuche eine Website zu einem bestimmten Zeitpunkt, wenn einige Informationen dort veröffentlicht werden sollen. Die Geschwindigkeit ist sehr wichtig, so dass das Setzen von TCP_NODELAY verhindert, dass kleine Teile von Daten in größeren Portionen gesammelt werden, bevor Pakete gesendet werden. –
* Was * 'kleine Teile von Daten'? Die HTTP-Anforderung wird fast sicher von der Bibliothek in einem einzigen send() gelöscht und von TCP als einzelnes Paket gesendet. Und das Festlegen von TCP_NODELAY an Ihrem Ende ändert nicht, wie der Peer die Antwort sendet. Keine echte Frage. – EJP