2017-10-30 1 views
3

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 초 후에 모든 다른 메시지를 한 번에 인쇄합니다.

이것은 실시간 로깅이 필요하기 때문에 문제가되고 실행이 끝나면 한 번에 모든 로그를받을 여유가 없습니다.

왜 이런 일이 발생하고 간단한 로그 서버를 구현하는 올바른 방법은 무엇입니까?

+2

'sleep (3000)'호출을 주석 처리하면 작동합니까? – Miguel

+0

이것은 함수가 끝나기 때문에 작동하며, 함수가 끝나고 다른 모든 emit이 시작되는 경우에만 작동합니다. 나는 다른 방출이 실시간으로 일어날 필요가 있고, 기능이 끝날 때뿐만 아니라. – Michael

+1

함수가 종료된다는 사실은 부적합합니다. 여기서 핵심은'sleep()'을 호출 할 때 블로킹한다는 것입니다. JS는 비동기 언어이므로 차단할 수 없습니다. – Miguel

답변

-1

실제로 사용하지 않는 함수는 JavaScript에 좋지 않습니다. 실제로 잠을 자지 않고 바쁜 대기 상태입니다. 즉, CPU가 3 초 동안 작동하기 때문에 CPU를 실행해야하는 다른 작업이 지연 될 수 있습니다.

당신은 뭔가 다른 일을하기 전에 3 초 기다리십시오

, 난 당신이 타이머 객체를 사용하는 것이 좋습니다 :

window.setTimeout(function() { alert('do something!'); }, 3000); 

당신이 대기 시간 동안 CPU를 해제합니다 타임 아웃을 사용하여 잠 경우, 그 JS 스케줄러가 Socket.IO를 지원하는 태스크와 같이 필요한 다른 태스크에 JS 스케줄러를 제공 할 수 있습니다.

희망이 도움이됩니다.

+0

이것은 제 질문과 관련이 없습니다. 요점은 첫 번째 방출 ("시작")은 즉시 (실시간) 발생하며 다른 방출은 기능이 끝날 때까지 "갇혀 있습니다"라는 것입니다. 기능이 끝나면 다른 모든 발광이 발생합니다. – Michael

+1

downvote 주셔서 감사합니다. 비동기 시스템의 작동 방식에 익숙하지 않은 것 같아서,'sleep()'함수가 왜 실제로 문제인지 이해하는 것이 좋습니다. – Miguel

+0

도움을 주셔서 감사합니다. 그러나 잠을 사용하는 것은 제 질문을 단순화하는 예였습니다. 내 원래 코드는 sleep 대신 "window.location.reload()"를 사용합니다. emit 호출이 즉시 발생하지 않기 때문에 (비동기식) reload 프로세스와 emits 호출은 경쟁 상태에 있고 일부는 성공적으로 서버를 호출하지만 일부는 페이지가 다시로드 되었기 때문에 누락되었습니다. 내가 보았던 것에서는 요청을 버퍼링하고 (1-n) 특정 시간에만 (예를 들어 기능의 끝) 플러시합니다. 방출 방법이 플러시되도록하는 방법이 필요합니다. 따라서 제 질문과 단순화로 수면을 사용하십시오. – Michael