Flask-socketio一次发送一个有效载荷

时间:2018-10-02 07:02:02

标签: python-3.x socket.io flask-socketio

我有以下使用Flask-socketio的Python脚本

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 :(得分:0)

使用eventlet或gevent时,time.sleep()函数正在阻止,它不允许运行任何其他任务。

解决此问题的三种方法:

  1. 使用socketio.sleep()代替time.sleep()
  2. 使用eventlet.sleep()gevent.sleep()
  3. Monkey对Python标准库进行了修补,以使time.sleep()变得异步友好。