socket.io JavaScript 클라이언트에서 데이터를 기록해야하는 Flask-SocketIO python 서버를 생성했습니다.Socket.IO 방출 지연 방출
서버 :
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