Se avete bisogno di accedere a tali beni a basso livello sul socket utilizzato, si dovrà sovraccaricare alcuni oggetti.
In primo luogo, è necessario creare una sottoclasse di HTTPHandler, che nella libreria standard fare:
class HTTPHandler(AbstractHTTPHandler):
def http_open(self, req):
return self.do_open(httplib.HTTPConnection, req)
http_request = AbstractHTTPHandler.do_request_
Come si può vedere, si utilizza un HTTPConnection
aprire la connessione ... Avrai per sovrascriverlo;) per aggiornare il metodo connect()
.
Qualcosa del genere dovrebbe essere un buon inizio:
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 è abbastanza intelligente per consentire di sottoclasse qualche gestore e poi usarlo, il urllib2.build_opener è fatto per questo:
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()
fonte
2013-07-26 13:10:12
Perché lo si imposta quando si chiama un server Web ??? – jgauffin
Sto interrogando un sito web in un momento specifico, quando alcune informazioni dovrebbero essere pubblicate lì. La velocità è molto importante, quindi impostare TCP_NODELAY evita di accumulare piccole porzioni di dati in porzioni più grandi prima di inviare pacchetti. –
* Cosa * 'piccole porzioni di dati'? La richiesta HTTP verrà quasi certamente svuotata dalla libreria in un singolo send() e inviata da TCP come un singolo pacchetto. E l'impostazione di TCP_NODELAY alla fine non cambia il modo in cui il peer invia la risposta. Non è una vera domanda. – EJP