Jeżeli chcesz mieć dostęp do takiej własności niski poziom na gnieździe używane, musisz przeciążać niektóre obiekty.
Po pierwsze, trzeba utworzyć podklasę HTTPHandler, że w standardowej bibliotece zrobić:
class HTTPHandler(AbstractHTTPHandler):
def http_open(self, req):
return self.do_open(httplib.HTTPConnection, req)
http_request = AbstractHTTPHandler.do_request_
Jak widać, używa HTTPConnection
otworzyć połączenie ... Musisz nadpisać to również;), aby zaktualizować metodę connect()
.
Coś jak to powinno być dobry początek:
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 jest wystarczająco inteligentny, aby umożliwić podklasy trochę obsługi, a następnie użyć, tym urllib2.build_opener jest za to:
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()
Dlaczego ustawiasz to podczas połączenia z serwerem internetowym ??? – jgauffin
Przepytałem stronę internetową w określonym czasie, gdy niektóre informacje powinny zostać tam opublikowane. Szybkość jest bardzo ważna, dlatego ustawienie TCP_NODELAY zapobiega gromadzeniu się małych porcji danych na większe porcje przed wysłaniem pakietu. –
* Jakie * "małe porcje danych"? Żądanie HTTP prawie na pewno zostanie przepelnione przez bibliotekę w jednym wysłaniu() i wysłane przez TCP jako pojedynczy pakiet. Ustawienie wartości TCP_NODELAY na końcu nie zmienia sposobu wysyłania odpowiedzi przez węzeł sieci. To nie jest prawdziwe pytanie. – EJP