Python 了解代理示例中的defer.DeferredQueue()
我试图理解一个使用Twisted的简单python代理示例。代理实例化一个服务器类,而服务器类又实例化一个客户机类。defer.DeferredQueue()用于将数据从客户端类传递到服务器类 我现在试图理解在这个示例中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(
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
方法来向队列添加对象,还有一个deferredget
方法
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()
检索并从队列中删除该对象),它将被传递给回调方法。