我创建了一个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秒后打印所有其他消息在一次拍摄。
这是一个问题,因为我需要实时日志记录,无法负担在执行结束时在一次拍摄中接收所有日志。
你知道为什么会发生这种情况吗?实现这个简单的日志服务器的正确方法是什么?
发布于 2017-10-31 08:54:35
您正在使用的sleep()函数对JavaScript来说真的很糟糕,因为您实际上并不是在休眠,而是在忙碌等待。这意味着CPU在这3秒内处于忙碌状态,因此需要CPU运行的其他任务会被延迟。
如果你需要在做其他事情之前等待3秒,我建议你使用timer对象:
window.setTimeout(function() { alert('do something!'); }, 3000);如果您使用超时睡眠,那么您将在等待期间释放CPU,这允许JS调度器将其提供给其他需要它的任务,例如那些支持Socket.IO发射的任务。
希望这能有所帮助!
https://stackoverflow.com/questions/47022784
复制相似问题