Веб-сокет Tornado - отправка данных на основе события

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

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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
202
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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 будет реестром, а веб-сокеты будут подписываться на сообщения (и отказываться от подписки при закрытии) при подключении.

Другие вопросы по теме