我有以下使用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,因此我确定我做错了什么。
答案 0 :(得分:0)
使用eventlet或gevent时,time.sleep()
函数正在阻止,它不允许运行任何其他任务。
解决此问题的三种方法:
socketio.sleep()
代替time.sleep()
。eventlet.sleep()
或gevent.sleep()
。time.sleep()
变得异步友好。