【问题标题】:Tornado websocket- send data based on an eventTornado websocket - 基于事件发送数据
【发布时间】:2018-09-01 09:19:02
【问题描述】:

我有一个 python 程序,它会在某些事件(例如 curl 请求)上计算函数值。我需要的是函数执行的那一刻,需要将一些数据发布到tornado websocket。我浏览了互联网并找到了有关如何创建 websocket 的示例,但所有这些示例都涵盖了在 websocket 处理程序中调用数据的场景

以该代码为例: https://github.com/benjaminmbrown/real-time-data-viz-d3-crossfilter-websocket-tutorial/blob/master/rt-data-viz/websocket_server.py

有人可以指导我如何在 websocket 上发布消息。基本上我有龙卷风 API,如果用户执行 curl 请求,我想将该消息记录到 websocket

【问题讨论】:

    标签: python websocket tornado


    【解决方案1】:

    您可以通过创建所有活动 websocket 的注册表并使用它来发送特定事件的消息来做到这一点。

    class WebsocketRegistry:
        def __init__(self):
            self._active_websockets = []
    
        def add_listener(self, listener):
            self._active_websockets.append(listener)
    
        def remove_listener(self, listener):
            self._active_websockets.remove(listener)
    
        def send_messages(self, msg_txt):
            for ws in self._active_websockets:
                ws.write_message(msg_txt)
    
    registry = WebsocketRegistry()
    
    class WSHandler(tornado.websocket.WebSocketHandler):
        def open(self, *args, **kwargs):
            super(WSHandler, self).open(*args, **kwargs)
            registry.add_listener(self)
    
        def on_close(self):
            super(WSHandler, self).on_close()
            registry.remove_listener(self)
    

    附:请注意,如果您计划使用 2 个以上的实例扩展您的应用程序,这将不起作用,您必须使用例如消息队列(RabbitMQ 很好)将事件传递到所有打开的 websocket。但总体方法是相同的:MQ 将是一个注册表,websocket 在连接时订阅消息(并在关闭时取消订阅)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多