【问题标题】:Flask-socketio sending payloads one at a timeFlask-socketio 一次发送一个有效载荷
【发布时间】:2018-10-02 07:02:02
【问题描述】:

我有以下使用 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,所以我确定我做错了什么。

【问题讨论】:

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


    【解决方案1】:

    当你使用 eventlet 或 gevent 时,time.sleep() 函数是阻塞的,它不允许任何其他任务运行。

    解决这个问题的三种方法:

    1. 使用socketio.sleep() 而不是time.sleep()
    2. 使用eventlet.sleep()gevent.sleep()
    3. Monkey 修补 Python 标准库,使 time.sleep() 变得对异步友好。

    【讨论】:

    • 我给了你三种解决问题的方法。第四种是不使用异步框架,或者换句话说,删除 eventlet 和/或 gevent。如果你想使用这些库之一,那么你不能使用线程。
    猜你喜欢
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 2022-06-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 2021-04-23
    • 1970-01-01
    相关资源
    最近更新 更多