2016-03-23 13 views
0

Ich habe einen Flask Python Webserver mit Websockets (socketIO).Flask + SocketIO - Ausgabe des Stream-Befehls an HTML-Element

Ich möchte einen Befehl ausführen und die Ausgabe auf ein <p id='streaming_text'> HTML-Element streamen.

Dies ist mein Code:

HTML

div class='streaming'> 
    <p id="streaming_text"></p> 
</div> 

JQuery

var socket = io.connect('http://' + document.domain + ':' + location.port + '/stream') 

socket.on('message', function(msg){ 
    $('#streaming_text').append(msg); 
}) 

... 

jqxhr.done(function(cmd){ 
    socket.send(cmd) 
    return false; 
}) 

Python

@socketio.on('message', namespace='/stream') 
def stream(cmd): 
    # Streams output of a command 
    print("Received msg %s from JS socket" % cmd) 
    print("Executing %s" % cmd) 
    from shelljob import proc 
    g = proc.Group() 
    p = g.run(cmd) 
    while g.is_pending(): 
     lines = g.readlines() 
     for proc, line in lines: 
      print(line) 
      send(line, namespace='/stream') 

im Browser-Konsole sehe ich alle send(line) zur gleichen Zeit ausgeführt werden: , wenn der Befehl beendet ausgeführt wird. Die print(line) zeigt mir jedoch die Ausgabe meines Befehls in Echtzeit.

Die Befehle, die ich ausführe, dauern im Durchschnitt 15 Minuten. Daher wäre es eine schlechte Benutzererfahrung, so lange warten zu müssen, ohne eine Ausgabe zu sehen.

Wie kann ich diese Nachrichten sofort senden, ohne auf das Ende des Befehls warten zu müssen?

Antwort

0

Um meine eigene Frage zu beantworten, löste ich dieses Problem durch Hinzufügen: eventlet.sleep(0) nach jedem send Aufruf im Python-Code.

Der neue Code ist als solche:

Python

@socketio.on('message', namespace='/stream') 
def stream(cmd): 
    # Streams output of a command 
    print("Received msg %s from JS socket" % cmd) 
    print("Executing %s" % cmd) 
    from shelljob import proc 
    g = proc.Group() 
    p = g.run(cmd) 
    while g.is_pending(): 
     lines = g.readlines() 
     for proc, line in lines: 
      print(line) 
      send(line, namespace='/stream') 

Anscheinend die Nachrichten zu spülen scheint, so sendet sie tatsächlich sofort zu, was Code, den Sie verwenden, sie zu empfangen, In meinem Fall ein JavaScript-Skript (JQuery).

Quelle:https://github.com/miguelgrinberg/Flask-SocketIO/issues/141

Verwandte Themen