あなたが使用するソケットに、このような低レベルのプロパティにアクセスする必要がある場合、あなたはいくつかのオブジェクトをオーバーロードする必要があります。
まず、あなたが標準ライブラリに行うことを、HTTPHandlerのサブクラスを作成する必要があります:
class HTTPHandler(AbstractHTTPHandler):
def http_open(self, req):
return self.do_open(httplib.HTTPConnection, req)
http_request = AbstractHTTPHandler.do_request_
あなたが見ることができるように、それは、接続を開くためにHTTPConnection
を使用しています...あなたは持っていますそれを無効にする;)connect()
メソッドをアップグレードします。 urllib2.build_openerは、このために作られ、
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のは、あなたがそれを使用し、いくつかのハンドラをサブクラス化することを可能にするのに十分なスマートです:このような
何かが良いスタートでなければなりません
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()
なぜWebサーバーを呼び出すときに設定しますか? – jgauffin
私はいくつかの情報がそこに掲載されるべきである特定の時間にウェブサイトをポーリングしています。速度は非常に重要です。したがって、TCP_NODELAYを設定すると、パケットを送信する前にデータの小さな部分をより大きな部分に累積することが回避されます。 –
*「データの小さな部分」とは何ですか? HTTPリクエストは、ほぼ確実にライブラリによって単一のsend()でフラッシュされ、TCPによって単一のパケットとして送信されます。最後にTCP_NODELAYを設定しても、ピアが応答を送信する方法は変わりません。本当の質問ではありません。 – EJP