Ich habe einen Flask-SocketIO Python-Server erstellt, der Daten von einem socket.io JavaScript-Client protokollieren sollte.Socket.IO Emit Sendeverzögerung
Server:
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)
Auftraggeber:
<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>
Statt zu sehen, die Server-Druck "Start", "Log: 1", "Log: 2" und "Log: 3" sofort .
Der Server druckt nur "Start" und druckt nach 3 Sekunden alle anderen Nachrichten in einer Aufnahme aus.
Dies ist ein Problem, da ich Echtzeitprotokollierung benötige und es mir nicht leisten kann, alle Protokolle am Ende der Ausführung in einem Durchgang zu empfangen.
Irgendeine Idee, warum das passiert und was ist der richtige Weg, um diesen einfachen Protokollserver zu implementieren?
Funktioniert es, wenn Sie den Aufruf 'sleep (3000)' auskommentieren? – Miguel
Es funktioniert, weil die Funktion endet, und nur wenn die Funktion endet, werden alle anderen emittiert. Ich brauche das andere emittiert in Echtzeit und nicht nur, wenn die Funktion endet. – Michael
Die Tatsache, dass die Funktion endet, ist irrelevant. Der Schlüssel hier ist, dass Sie blockieren, wenn Sie 'sleep()' aufrufen. Sie können nicht blockieren, da JS eine asynchrone Sprache ist. – Miguel