socket.io JavaScriptクライアントからデータをログに記録するFlask-SocketIO pythonサーバーを作成しました。Socket.IO Emit Sending in Delay
サーバー:
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>
代わりのサーバーの印刷 "スタート"、 "ログ:1" を見てすぐに: "3ログ" と "2ログ" を、 。
サーバーは「開始」のみを印刷し、3秒後には他のすべてのメッセージをワンショットで印刷します。
これは私がリアルタイムログを必要とするため問題であり、実行終了時にすべてのログをワンショットで受け取る余裕がありません。
これがなぜ起こっているのか、この単純なログサーバーを実装する正しい方法は何ですか?
'sleep(3000)'コールをコメントアウトすると動作しますか? – Miguel
これは、関数が終了し、関数が終了したときにのみ、他のすべてのemitが起動されるために機能します。私はリアルタイムで、そして機能が終了するときだけでなく、他の発光も必要です。 – Michael
関数が終了するということは無関係です。ここでの鍵は 'sleep()'を呼び出すときにブロックしていることです。 JSは非同期言語なので、ブロックすることはできません。 – Miguel