Обновление веб-страницы из фонового потока с использованием socket.io, но без триггера события?

Почти в каждом найденном мной примере Flask/Socket.io Socket.io запускает событие, которое затем обрабатывается приложением Flask и выдает любой ответ.

Мне нужно последовательно отправлять новые данные на страницу без триггера события. В онлайн-руководстве Flask/Socket.io кратко упоминается об этом, но я м вроде застрял.

На данный момент я только отправляю данные о клиентских подключениях, создавая новый поток для каждого подключения. Вот мой код для этого:

@socketio.on('connect', namespace='/test')
def test_connect():
    # need visibility of the global thread objects
    print "We're working"
    global thread
    print('Client connected')

if not thread.isAlive():
    print "Starting Thread"
    thread = RandomThread()
    thread.start()

А потом:

class RandomThread(Thread):
    def __init__(self):
        self.delay = 6
        super(RandomThread, self).__init__()

        ## Find Tweets every X amount of seconds
        def tweetFinder(self):
        print "Finding Tweets..."

        while not thread_stop_event.isSet():
            twit = Twitter()
            twit.login()
            cityName = twit.getUserTweets()
            print cityName
            socketio.emit('newnumber', {'number': cityName}, namespace='/test')
            sleep(self.delay)

    def run(self):
        self.tweetFinder()

Но как мне запустить этот поток/процесс загрузки данных сразу при запуске приложения? Я просто хочу, чтобы он работал как непрерывная бесконечная задача в бэкэнде, обновляя страницу независимо от событий.

Вот что говорят документы Flask/Socket-io, я просто не могу понять, как заставить его работать так, как я хочу.

Во всех примерах, показанных до этого момента, сервер отвечает на событие, отправленное клиентом. Но для некоторых приложений сервер должен быть отправителем сообщения. Это может быть полезно для отправки клиентам уведомлений о событиях, происходящих на сервере, например, в фоновом потоке. Методы socketio.send() и socketio.emit() можно использовать для трансляции всем подключенным клиентам:

def some_function():
    socketio.emit('some event', {'data': 42})

Обратите внимание, что в этом случае нет клиентского контекста, поэтому предполагается, что широковещательная рассылка = True, и его не нужно указывать.


person carbon_ghost    schedule 18.12.2014    source источник
comment
Не уверен, что понимаю проблему. Ваша единственная проблема в том, что вы хотите запустить фоновый поток до того, как клиент подключится? Если да, то почему бы вам не запустить поток прямо перед вызовом socketio.run()?   -  person Miguel    schedule 19.12.2014
comment
Я сделал что-то очень похожее, основываясь на примере, к которому меня направили на github. Посмотрите здесь: stackoverflow.com/questions/41443676/. Мой пример — получение данных из потока ZeroMQ, но вместо этого вы могли бы так же легко генерировать данные в этом фоновом потоке.   -  person Jon Cage    schedule 04.01.2017