【发布时间】:2018-04-11 21:03:26
【问题描述】:
我创建了一个 Flask-SocketIO python 服务器,它应该记录来自 socket.io JavaScript 客户端的数据。
服务器:
from flask import Flask, render_template
from flask_socketio import SocketIO
app = Flask(__name__)
socketio = SocketIO(app)
@socketio.on('connect')
def handle_connect():
print 'Connected'
@socketio.on('disconnect')
def handle_disconnect():
print 'Disconnected'
@socketio.on('start')
def handle_start():
print 'Start'
@socketio.on('log')
def handle_log(data):
print('Log: ' + data)
if __name__ == '__main__':
socketio.run(app)
客户:
<script src="socket.io.js"></script>
<script>
function sleep(ms) {
var unixtime_ms = new Date().getTime();
while(new Date().getTime() < unixtime_ms + ms) {}
}
var socket = io.connect('http://127.0.0.1:5000', {'forceNew':true });
socket.on('connect', function()
{
socket.emit('start');
socket.emit('log', '1');
socket.emit('log', '2');
socket.emit('log', '3');
sleep(3000)
});
</script>
而不是立即看到服务器打印“Start”、“Log: 1”、“Log: 2”和“Log: 3”。
服务器只打印“开始”,并在 3 秒后一次性打印所有其他消息。
这是一个问题,因为我需要实时记录,并且无法在执行结束时一次性接收所有日志。
知道为什么会这样吗?实现这个简单日志服务器的正确方法是什么?
【问题讨论】:
-
注释掉
sleep(3000)调用是否有效? -
它之所以有效,是因为函数结束了,只有当函数结束时,所有其他的 emit 才会被触发。我需要其他发射实时发生,而不仅仅是在函数结束时。
-
函数结束的事实无关紧要。这里的关键是当你调用
sleep()时你被阻止了。你不能阻塞,因为 JS 是一种异步语言。
标签: javascript socket.io flask-socketio emit