在python中禁用nagle:如何以正确的方式执行?

时间:2013-01-18 17:31:32

标签: sockets python-2.6 nagle

我需要在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很新,很容易在这里找不到一些明显的解决方案)

2 个答案:

答案 0 :(得分:3)

无法更改httplib指定的套接字选项,也无法传入自己的套接字对象。在我看来,这种缺乏灵活性是大多数Python HTTP库的最大弱点。例如,在Python 2.6之前,甚至无法为连接指定超时(除了全局使用socket.setdefaulttimeout(),这不是很干净)。

如果您不介意外部依赖项,则看起来像httplib2 already has TCP_NODELAY specified

可以猴子修补库。因为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()方法的中间 - 猴子修补使得这非常棘手。

总之,我不认为有一个简单的答案,我害怕。

答案 1 :(得分:3)

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

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

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