2

我正在尝试使用位于此处的 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 交手,所以事情似乎相当令人生畏。对事物如何连接的一个小解释将使掌握这一点变得更加容易。

4

1 回答 1

2

根据文档,DeferredQueue 有一个put将对象添加到队列的普通方法和一个 deferredget方法。

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

于 2012-09-24T08:00:01.910 回答