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

成功了。

显然,如果可能的话,我想避免修补系统库。所以,问题是:做这件事的正确方法是什么?(我对python很陌生,在这里很容易错过一些明显的解决方案)

4

2 回答 2

4

请注意,如果直接使用套接字库,则以下内容就足够了:

self.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, True)

我将此信息附加到已接受的答案中,因为它满足了将我带到这里的信息需求。

于 2017-07-13T19:06:16.360 回答
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 回答