Flask-SocketIo, как поделиться данными между потоком Python и потоком socketio.start_background_task? - PullRequest
0 голосов
/ 19 ноября 2018

Цели:

  1. socketio.run (приложение) запускает сервер и использует цикл while для бесконечной передачи данных нескольким javascripts (клиентам).

  2. Данные поступают из другого цикла while, но цикл необходимо запустить после запуска сценария ( независимо от клиентского соединения ) для другого использования.

Ток:

  1. Для первого пункта у меня уже есть следующий код:

    def background_thread():
        while True:
            socketio.emit('response',{'data': value},namespace='/test')
    
    @socketio.on('connect', namespace='/test')
    def test_connect():
        global thread
        with thread_lock:
            if thread is None:
                thread = socketio.start_background_task(target=background_thread)
        emit('response', {'data': 'Connected'})
    
    if __name__ == '__main__':
        socketio.run(app, debug=True, host='localhost', port=args.portNum)
    

Сверху я добавляю поток только после того, как клиенты подключаются к серверу . Я не знаю, как мне достичь пункта 2 с этого момента? Я имею в виду наличие другого потока, но возникают проблемы с организацией кода, так что socketio.start_background_task может обмениваться данными бесконечно с потоком Python по умолчанию, как только клиенты подключаются к серверу.

Дополнительный вопрос: как разрешить нескольким клиентам подключаться к одному серверу?

Спасибо всем!

1 Ответ

0 голосов
/ 23 ноября 2018

Я не уверен, что понимаю ваш вопрос, но если вы спрашиваете, как запустить поток независимо от клиентских подключений, вы можете просто запустить его прямо перед запуском сервера:

if __name__ == '__main__':
    socketio.start_background_task(my_other_thread)
    socketio.run(app, debug=True, host='localhost', port=args.portNum)

Если вам нужно синхронизировать эти два потока, как, например, когда my_other_thread имеет новое значение для отправки, background_thread немедленно забирает его и отправляет, тогда вы можете использовать стандартные примитивы синхронизации потоков. Может быть, вам нужен Event экземпляр в этом случае. См. Документы по многопоточности Python в стандартной библиотеке.

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

...