3

Python2.6 で nagle アルゴリズムを無効にする必要があります。そのようにhttplib.pyでHTTPConnectionにパッチを当てることがわかりました

    def connect(self):
        """Connect to the host and port specified in __init__."""
        self.sock = socket.create_connection((self.host,self.port),
                                         self.timeout)
        self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, True) # added line

トリックを行います。

明らかに、可能であればシステム lib にパッチを適用することは避けたいと考えています。それで、問題は次のとおりです。そのようなことを行う正しい方法は何ですか?(私はPythonにかなり慣れていないため、ここで明らかな解決策を簡単に見逃してしまう可能性があります)

4

2 に答える 2

3

指定するソケット オプションを変更することはできません。またhttplib、独自のソケット オブジェクトを渡すこともできません。私の意見では、この種の柔軟性の欠如は、ほとんどの Python HTTP ライブラリの最大の弱点です。たとえば、Python 2.6 より前では、接続のタイムアウトを指定することさえできませんでした(socket.setdefaulttimeout()をグローバルに使用する場合を除いて、あまりクリーンではありませんでした)。

外部依存関係を気にしなければ、httplib2 はすでにTCP_NODELAY指定されているようです。

ライブラリにモンキー パッチを適用できます。Python は動的言語であり、多かれ少なかれすべてが実行時にネームスペース ルックアップとして行われるため、関連するクラスの適切なメソッドを単純に置き換えることができます。

:::python
import httplib

def patch_httplib():
    orig_connect = httplib.HTTPConnection.connect
    def my_connect(self):
        orig_connect(self)
        self.sock.setsockopt(...)

ただし、これらのライブラリ関数とクラスが変更されるため、コードが特定の Python バージョンに非常に固有になることを意味するため、これは非常にエラーが発生しやすくなります。たとえば、2.7 に_tunnel()はソケットを使用するメソッドが呼び出されているため、メソッドの途中でフックする必要がありますconnect()。モンキー パッチを適用すると、これが非常に難しくなります。

要するに、簡単な答えはないと思います。

于 2013-01-18T17:58:21.260 に答える