我需要在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很新,很容易在这里找不到一些明显的解决方案)
答案 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)
我将此信息附加到接受的答案,因为它满足了我带来的信息需求。