Flask SocketIO генерирует серию событий

#reactjs #flask #socket.io #flask-socketio

#reactjs #flask #socket.io #flask-socketio

Вопрос:

Я бы хотел, чтобы сервер передавал серию событий клиенту (реагировал) после установления соединения, я пробовал:

 @socketio.on('connect')
def test_connect():
    for i in range(10):
        emit('my response', {'data': 'Connected '   str(i)})
        time_module.sleep(2)
 

но события отображаются в консоли веб-браузера одновременно, как будто они прибыли в один и тот же момент, в react, который я использую :

 useEffect(() => {
    const socket = socketIOClient(ENDPOINT);

    socket.on('my response', function (data) {
      console.log('my response: ', data.data);
    })
})
 

Ответ №1:

В вашем серверном коде есть две потенциальные проблемы.

Прежде всего, что есть time_module в вашем примере? Я подозреваю, что это блокирующий сон, который вы делаете. Вместо этого я предлагаю вам хорошенько выспаться socketio.sleep(2) .

Вторая проблема заключается в том, что вы делаете это в обработчике connect событий. Розетка.Сервер ввода-вывода ожидает, пока вы не вернетесь из обработчика подключения, чтобы решить, принят клиент или отклонен, поэтому, как правило, вы не хотите, чтобы выполнение этого обработчика занимало много времени, поскольку соединение не будет полностью установлено до вашего возвращения. Я предлагаю вам вместо этого перенести эту логику в фоновую функцию.

Следующий код решает обе проблемы:

 def initial_events():
    for i in range(10):
        emit('my response', {'data': 'Connected '   str(i)})
        socketio.sleep(2)

@socketio.on('connect')
def test_connect():
    socketio.start_background_task(initial_events)
 

Комментарии:

1. Этот ответ действительно хорош, настоящий источник знаний, time_module был просто временным модулем, есть ли учебные пособия, в которых я могу изучать такие вещи, как start_background_task?