2013-09-27 50 views
1

任务间通信我有,目前执行以下操作的客户:使用DeferredQueue在扭曲

  1. 连接
  2. 收集一些数据在本地
  3. 把数据发送到服务器
  4. 重复
  5. 如果断开,重新连接并继续上述(未示出)

像这样:

def do_send(self): 
    def get_data(): 
     # do something 
     return data 

    def send_data(data) 
     self.sendMessage(data) 

    return deferToThread(get_data).addCallback(send_data) 

def connectionMade(self): 
    WebSocketClientProtocol.connectionMade(self) 
    self.sender = task.LoopingCall(self.do_send) 
    self.sender.start(60) 

然而,在断开连接时,我想数据收集继续,可能排队,写在一定的限制文件。我已经回顾了DeferredQueue对象,看起来像我需要的,但我似乎无法破解它。

在伪代码,它会去是这样的:

queue = DeferredQueue 

# in a separate class from the client protocol 
def start_data_collection(): 
    self.collecter = task.LoopingCall(self.get_data) 
    self.sender.start(60) 

def get_data() 
    # do something 
    queue.put(data) 

然后让客户端协议检查队列,这是我迷路。 DeferredQueue是我需要的,还是有更好的方法?

回答

2

一个列表也可以工作。你大概会迷路在同一个地方 - 你如何让客户端协议检查列表?

无论哪种方式,这里有一个答案:

queued = [] 

... 

connecting = endpoint.connect(factory) 
def connected(protocol): 
    if queued: 
     sending = protocol.sendMessage(queued.pop(0)) 
     sending.addCallback(sendNextMessage, protocol) 
     sending.addErrback(reconnect) 
connecting.addCallback(connected) 

这里的想法是,在某些时候的事件发生:你建立连接。此示例将该事件表示为connectingDeferred。当事件发生时,connected被调用。此示例弹出队列中的第一项(a list)并发送它。它等待发送被确认,然后发送下一条消息。这也意味着通过重新连接来处理错误的一些逻辑。

你的代码可能看起来不一样。您可以使用Protocol.connectionMade回调代替连接事件。核心思想是相同的 - 定义回调来处理特定事件。无论您使用端点的connectDeferred还是使用协议的connectionMade都无关紧要。