13

Webページのロードにurllib2を使用しています。コードは次のとおりです。

httpRequest = urllib2.Request("http:/www....com")
pageContent = urllib2.urlopen(httpRequest)
pageContent.readline()

設定するソケットのプロパティを取得するにはどうすればよいTCP_NODELAYですか?

通常のソケットでは、関数を使用します:

socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
4

3 に答える 3

14

使用されているソケットでこのような低レベルのプロパティにアクセスする必要がある場合は、いくつかのオブジェクトをオーバーロードする必要があります。

まず、標準ライブラリで行うHTTPHandlerのサブクラスを作成する必要があります。

class HTTPHandler(AbstractHTTPHandler):

    def http_open(self, req):
        return self.do_open(httplib.HTTPConnection, req)

    http_request = AbstractHTTPHandler.do_request_

ご覧のとおり、接続を開くために a を使用しています...メソッドHTTPConnectionをアップグレードするには、それもオーバーライドする必要があります;) 。connect()

このようなものは良いスタートになるはずです:

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.build_openerが作成されています。

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()
于 2013-07-26T13:10:12.117 に答える