2011-04-27 51 views

回答

4

不幸的是,代理并不像它直接使用Protocol实例那样容易,但也不是不可能。

的关键就在这里,在代理的类定义:

_protocol = HTTP11ClientProtocol 

为了获得访问您可以覆盖connectionMade上HTTP11ClientProtocol运输,以及代理。

所以你最终的东西,如:

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代替代理的,你会在客户端上获得TCP NODELAY。

**注**,这不是唯一的方法来做到这一点,但有一种方法可以做到这一点,并继续使用Agent.request。或者,编写自己的代理程序处理请求并将其连接到客户端,并将请求连同TCP节点连接在延迟链中。

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

+1

不要忘记'_'的意思是“私人”。 – 2011-04-28 11:38:45

+0

@JP:我的实用主义者经常与我想要不违反API约定的图书馆维护者交战。不幸的是,实用主义者经常获胜。既然您对Twisted有更多的个人知识,您是否碰巧知道为什么在客户端中将“协议”属性标记为私有?这与许多其他工厂类型的对象有些不一致。 – Crast 2011-05-03 22:12:58