【问题标题】:Access socket options for twisted.web.client.Agent访问 twisted.web.client.Agent 的套接字选项
【发布时间】:2011-04-27 23:30:21
【问题描述】:

如何从 twisted.web.client.Agent 访问底层套接字?我需要在这个套接字上启用 TCP_NODELAY。

【问题讨论】:

    标签: python twisted twisted.web twisted.client


    【解决方案1】:

    不幸的是,Agent 并没有像您直接使用协议实例那样简单,但这也不是不可能的。

    关键在这里,在Agent的类定义中:

    _protocol = HTTP11ClientProtocol
    

    为了访问传输,您可以覆盖 HTTP11ClientProtocol 上的 connectionMade 以及代理。

    所以你最终会得到类似的东西:

    from twisted.web import client
    class MyHTTPClient(client.HTTP11ClientProtocol):
        def connectionMade(self):
            self.transport.setTcpNoDelay(True)
            client.HTTP11ClientProtocol.connectionMade(self) # call the super-class's connectionMade
    
    class MyAgent(client.Agent):
        _protocol = MyHTTPClient
    

    现在使用 MyAgent 代替 Agent,您将在客户端获得 TCP nodelay。

    ** 注意 **,这不是执行此操作的唯一方法,而是您可以这样做并继续使用 Agent.request 的一种方法。或者,编写您自己的代理来制作请求并将其连接到客户端,并将您的请求与 TCP 节点层一起连接到延迟链中。

    ** 注意 2 ** 在这种情况下,假设 'transport' 具有 setTcpNoDelay() 方法很好,因为这是一个非常合理的假设,您将使用 TCP 作为 HTTP 请求的传输。不过,这可能不是一个完全扭曲的聪明想法。

    【讨论】:

    • 别忘了_ 的意思是“私人的”。
    • @JP:我内心的实用主义者经常与不想违反 API 约定的库维护者发生争执。不幸的是,实用主义者经常获胜。由于您对 Twisted 有更多的个人知识,您是否知道为什么在客户端的情况下“协议”属性被标记为私有?这与许多其他工厂类型的对象有些不一致。
    猜你喜欢
    • 2010-11-15
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多