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

Python 了解代理示例中的defer.DeferredQueue(),python,twisted,Python,Twisted,我试图理解一个使用Twisted的简单python代理示例。代理实例化一个服务器类,而服务器类又实例化一个客户机类。defer.DeferredQueue()用于将数据从客户端类传递到服务器类 我现在试图理解在这个示例中defer.DeferredQueue()是如何工作的。例如,该声明的意义是什么: self.srv_queue.get().addCallback(self.clientDataReceived) 这是类似的 self.cli_queue.get().addCallback(

我试图理解一个使用Twisted的简单python代理示例。代理实例化一个服务器类,而服务器类又实例化一个客户机类。defer.DeferredQueue()用于将数据从客户端类传递到服务器类

我现在试图理解在这个示例中defer.DeferredQueue()是如何工作的。例如,该声明的意义是什么:

self.srv_queue.get().addCallback(self.clientDataReceived)
这是类似的

self.cli_queue.get().addCallback(self.serverDataReceived)
声明

执行
self.cli\u queue.put(False
)或
self.cli\u queue=None
时会发生什么情况

现在只是想和Twisted打交道,所以事情看起来很可怕。对事物如何连接的一个小的解释将使我们更容易掌握这一点。

根据,DeferredQueue有一个普通的
put
方法来向队列添加对象,还有一个deferred
get
方法

get
方法返回一个延迟对象。向对象添加
回调
方法(例如
serverDataReceived
)。只要队列中的对象可用,延迟对象就会调用
回调
方法对象将作为参数传递给方法。如果队列为空或serverDataReceived方法尚未完成执行,则程序仍将继续执行下一条语句。当队列中有新对象可用时,将调用
回调
方法,而不考虑程序的执行点

换句话说,它是一个异步流,与同步流模型相反,在同步流模型中,您可能有一个BlockingQueue,也就是说,您的程序将等待队列中的下一个可用对象继续执行

在示例程序
self.cli\u 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只是为了在连接关闭后丢弃队列

谢谢你的回答。更清楚的是:“对象将作为参数传递给方法。”将被读取为“放入延迟队列的对象将作为参数传递给
回调
方法”。对吗?是的。当从队列中检索放入队列的对象时(
get()
检索并从队列中删除该对象),它将被传递给回调方法。