理解defer.DeferredQueue()在代理examp中

2024-10-02 00:30:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我现在想知道defer.DeferredQueue()在本例中起作用。例如,这句话的意义是什么:

self.srv_queue.get().addCallback(self.clientDataReceived)

这是类似的

^{pr2}$

声明。在

执行self.cli_queue.put(False)或{}时会发生什么?在

现在只是想和Twisted打交道,所以事情看起来挺吓人的。简单解释一下事物是如何联系在一起的,会使我们更容易理解这一点。在


Tags: 数据实例self服务器客户端示例代理客户机
1条回答
网友
1楼 · 发布于 2024-10-02 00:30:51

根据documentation,DeferredQueue有一个普通的put方法来向队列添加对象,还有一个延迟的get方法。在

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

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

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

相关问题 更多 >

    热门问题