2012-09-21 53 views
2

我想了解一个简单的使用Twisted的Python代理示例here。代理实例化一个服务器类,然后实例化一个客户类。 defer.DeferredQueue()用于将数据从客户端类传递到服务器类。了解代理示例中的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时会发生什么?

只是试图与扭曲现在握手,所以事情似乎很艰巨。关于事物如何连接的一个小解释将使得更容易掌握这一点。

回答

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

+0

感谢您的回答。要更清楚一点:“该对象将作为参数传递给该方法。”应被理解为“放入DeferredQueue中的对象将作为参数传递给'callback'方法”。正确? –

+1

是的。当从队列中检索放入队列中的对象('get()'从队列中检索并移除对象)时,它将被传递给回调方法。 –