Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Twisted中使用延迟队列进行任务间通信_Python_Asynchronous_Twisted_Deferred - Fatal编程技术网

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
    回调来表示连接事件。核心思想是相同的——定义回调以在某些事件发生时处理它们。无论您是使用端点的
    连接
    延迟
    还是协议的
    连接模式
    ,都无关紧要