Tornado websocket - отправка данных на основе события - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть программа на Python, которая при определенном событии (например, при запросе curl) вычисляет значение функции. Что мне нужно, так это то, что в момент выполнения функции некоторые данные должны быть опубликованы в веб-сокете торнадо. Я просмотрел интернет и нашел примеры того, как создать веб-сокет, но все эти примеры охватывают сценарии, когда данные вызываются внутри обработчика веб-сокета

Ссылаясь на этот код, например: https://github.com/benjaminmbrown/real-time-data-viz-d3-crossfilter-websocket-tutorial/blob/master/rt-data-viz/websocket_server.py

Может ли кто-нибудь подсказать мне, как можно публиковать сообщения в сети. В основном у меня есть API торнадо, где, если пользователь делает запрос curl, я бы хотел записать это сообщение в websocket

1 Ответ

0 голосов
/ 03 сентября 2018

Вы можете сделать это, создав реестр всех активных веб-сокетов и использовать его для отправки сообщений об определенном событии.

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)

P.S. Обратите внимание, что если вы планируете масштабировать свое приложение с 2+ экземплярами, это не сработает, и вам придется использовать, например, очередь сообщений (хорошо подходит RabbitMQ) для доставки событий во все открытые веб-сокеты. Но общий подход был бы таким же: MQ - это реестр, а веб-сокеты подписываются на сообщения (и отписываются при закрытии) при подключении.

...