1

I have a Client that currently does the following:

  1. connects
  2. collects some data locally
  3. sends that data to a server
  4. repeats
  5. if disconnected, reconnects and continues the above (not shown)

Like this:

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)

However, when disconnected, I would like the data collection to continue, probably queuing and writing to file at a certain limit. I have reviewed the DeferredQueue object which seems like what I need, but I can't seem to crack it.

In pseudo-code, it would go something like this:

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)

Then have the client protocol check the queue, which is where I get lost. Is DeferredQueue what I need, or is there a better way?

4

1 に答える 1

2

リストも同様に機能します。おそらく同じ場所で迷子になるでしょう-クライアントプロトコルにリストをチェックさせるにはどうすればよいですか?

いずれにせよ、ここに1つの答えがあります:

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)

ここでの考え方は、ある時点でイベントが発生するということです。つまり、接続が確立されます。この例では、そのイベントを として表していconnecting Deferredます。イベントが発生すると、connectedが呼び出されます。この例では、キュー (a list) から最初のアイテムをポップして送信します。送信が確認されるのを待ってから、次のメッセージを送信します。また、再接続によるエラーの処理に関するいくつかのロジックも意味します。

あなたのコードは異なって見えるかもしれません。Protocol.connectionMade代わりに、コールバックを使用して接続イベントを表すことができます。コアとなる考え方は同じです - 特定のイベントが発生したときにそれを処理するコールバックを定義します。エンドポイントを使用するかconnect Deferredプロトコルを使用するかconnectionMadeは問題ではありません。

于 2013-09-27T18:25:12.227 に答える