Python 在Twisted中使用延迟队列进行任务间通信
我有一个客户目前正在执行以下操作:Python 在Twisted中使用延迟队列进行任务间通信,python,asynchronous,twisted,deferred,Python,Asynchronous,Twisted,Deferred,我有一个客户目前正在执行以下操作: 连接 在本地收集一些数据 将该数据发送到服务器 重复 如果断开,则重新连接并继续上述操作(未显示) 像这样: def do_send(self): def get_data(): # do something return data def send_data(data) self.sendMessage(data) return deferToThread(get_data).add
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)
但是,当断开连接时,我希望数据收集继续进行,可能会以一定的限制排队并写入文件。我已经检查了延迟队列对象,它似乎是我所需要的,但我似乎无法破解它
在伪代码中,它是这样的:
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)
然后让客户端协议检查队列,这就是我丢失的地方。延迟排队是我需要的,还是有更好的方法?列表也可以。您可能会在同一个地方迷路-如何让客户端协议检查列表 不管怎样,这里有一个答案:
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)
这里的想法是,在某个时刻发生了一件事:你的联系建立了。此示例将该事件表示为连接延迟事件。当事件发生时,调用connected
。本例从队列(一个列表
)中弹出第一个项目并发送它。它等待确认发送,然后发送下一条消息。它还暗示了通过重新连接来处理错误的一些逻辑
你的代码可能看起来不一样。您可以使用Protocol.connectionMade
回调来表示连接事件。核心思想是相同的——定义回调以在某些事件发生时处理它们。无论您是使用端点的连接
延迟
还是协议的连接模式
,都无关紧要