在代理示例中了解defer.DeferredQueue()

时间:2012-09-21 16:32:58

标签: python twisted

我正在尝试使用位于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交手,所以事情似乎相当艰巨。对事情如何联系的一个小解释将使得更容易掌握这一点。

1 个答案:

答案 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只是在连接关闭后丢弃队列。