我正在尝试使用位于here的Twisted来理解一个简单的python代理示例。代理实例化服务器类,服务器类又实例化客户端类。 defer.DeferredQueue()用于将数据从客户端类传递到服务器类。
我现在试图了解defer.DeferredQueue()在此示例中的工作原理。例如,这个陈述的意义是什么:
self.srv_queue.get().addCallback(self.clientDataReceived)
和它类似
self.cli_queue.get().addCallback(self.serverDataReceived)
语句。
执行self.cli_queue.put(False
)或self.cli_queue = None
时会发生什么?
现在试着与Twisted交手,所以事情似乎相当艰巨。对事情如何联系的一个小解释将使得更容易掌握这一点。
答案 0 :(得分:2)
根据documentation,DeferredQueue有一个正常的put
方法来将对象添加到队列和一个延迟的get
方法。
get
方法返回Deferred对象。您向对象添加callback
方法(例如serverDataReceived
)。每当队列中的对象可用时,Deferred对象将调用callback
方法。 该对象将作为参数传递给方法。如果队列为空或serverDataReceived方法尚未完成执行,则程序仍会继续执行下一个语句。当队列中有新对象时,无论程序执行点如何,都将调用callback
方法。
换句话说,它是一个异步流,与同步流模型相反,在其中,您可能有一个BlockingQueue,即您的程序将等到队列中的下一个对象继续执行。
在示例程序self.cli_queue.put(False)
中,向队列添加一个False对象。它是一种标志,告诉ProxyClient线程不再有任何数据添加到队列中。这样就应该断开远程连接。你可以参考这部分代码:
def serverDataReceived(self, chunk):
if chunk is False:
self.cli_queue = None
log.msg("Client: disconnecting from peer")
self.factory.continueTrying = False
self.transport.loseConnection()
设置cli_queue = None只是在连接关闭后丢弃队列。