Flask-socketio отправляет полезные нагрузки по одному - PullRequest
0 голосов
/ 02 октября 2018

У меня есть следующий скрипт Python, который использует Flask-socketio

from flask import Flask, render_template
from flask_socketio import SocketIO, emit
from time import sleep

app = Flask(__name__)
app.config['SECRET_KEY'] = 'P@ssw0rd'

socketio = SocketIO(app)

@app.route('/')
def index():
    return render_template('index.html')


@socketio.on('connect')
def on_connect():
    payload1 = 'Connected!!!'
    payload2 = 'Doing thing 1'
    payload3 = 'Doing thing 2'
    emit('send_thing', payload1, broadcast=True)
    sleep(2)
    emit('send_thing', payload2, broadcast=True)
    sleep(2)
    emit('send_thing', payload3, broadcast=True)


if __name__ == '__main__':
    socketio.run(app)

А вот соответствующий index.html

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>SocketIO Python</title>
</head>

<body>
  <div id="my-div"></div>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.4.5/socket.io.js"></script>
  <script>
    (function init() {
      var socket = io()
      var divElement = document.getElementById('my-div')

      socket.on('send_thing', function(payload) {
        var dataElement = document.createElement('inner')
        dataElement.innerHTML = payload
        divElement.appendChild(dataElement)
      })
    })()
  </script>
</body>

</html>

Что я пытаюсь достичь, это когдаклиент подключается, он сначала говорит «Подключен !!!»а затем через 2 секунды появляется новый «внутренний» элемент с надписью «Делать вещь 1», а затем через 2 секунды появляется новый «внутренний» элемент с надписью «Делать вещь 2» и т. д.

Но что происходитзаключается в том, что когда клиент подключается, он отправляет все 3 строки одновременно (через 4 секунды, что является обеими операторами сна).Это первый раз, когда я использую SocketIO, поэтому я уверен, что сделал что-то не так.

1 Ответ

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

Когда вы используете eventlet или gevent, функция time.sleep() блокирует, она не позволяет запускать какие-либо другие задачи.

Три способа решения этой проблемы:

  1. Используйте socketio.sleep() вместо time.sleep().
  2. Используйте eventlet.sleep() или gevent.sleep().
  3. Обезьяна исправит стандартную библиотеку Python, так что time.sleep() станет асинхронным.
...