2016-07-27 12 views
0

Ich versuche hier mit meinem Back-End (Python 2.7 FLASK) zu interagieren, indem Sie die Tasten auf meiner Front-HTML.Seltsames Verhalten mit FLASK socketIO in Python mit der Bibliothek eventlet

Hier ist das Verhalten, das ich erwarte:

Meine Zustandsmaschine ist in einem Wartestatus (für Benutzeraktion warte)

startEvent.wait()

Wenn ich die Taste START drücken, habe ich ein Ereignis in meinem Rücken Ende

@GUI.route('/ptu1', methods=['GET', 'POST']) 
def startButton(): 
    if request.method == 'POST': 
     startEvent.set() 
     return redirect(url_for('index')) 

dann sende ich eine Nachricht auf meiner hTML-Seite mit einem socketIO wie diese

socket_gui.emit('socket_field', 
        {'data': msg, 'count': self.count,'flag': 1}, 
        namespace='/test') 

Der Javascript-Code, der diese Nachricht empfangen ist:

socket.on('socket_field', function(msg) { 

      $('#Status').text(msg.data); 

      if (msg.flag == '1'){ 

       //do things 
      } 
      if (msg.flag == '2'){ 

       //do others things 
      } 

     }); 

Vorerst dieser Code funktioniert, weil, wenn ich meine Start-Taste drücken, es das Ereignis senden und dann die Buchse an meinem Frontend senden javascript welche machen die Aktion, die ich will.

Dann gehe ich in Wartemodus (wartet auf die Benutzer den zweiten Knopf drücken)

printEvent.wait() 
socket_gui.emit('socket_field', 
        {'data': msg, 'count': self.count,'flag': 2}, 
        namespace='/test') 

ich das Ereignis festgelegt, wenn ich auf die Schaltfläche klicken:

@GUI.route('/print1', methods=['GET', 'POST']) 
def printButton(): 
    if request.method == 'POST': 
     printEvent.set() 
     return redirect(url_for('index')) 

UND IST HIER DAS PROBLEM : Der erste Schritt mit dem Startknopf funktioniert einwandfrei, der Socket wird emitiert und das Javascript bekommt es und behandelt es wie ich will.

Aber wenn ich die Drucken-Taste drücke, kann ich in meinen Protokollen sehen, dass der Socket korrekt mit den guten Argumenten ausgegeben wird, aber das Javascript im Frontend wird nie empfangen.

Es scheint, dass das Warteereignis den Emit-Socket blockiert.

In der Tat habe ich versucht, eine Nachricht mit dem Sockel vor der Wartezeit zu senden und es funktioniert.

Ich denke, das Problem ist in der Bibliothek, die ich benutze: evenlet Ich versuchte mit einer Gevent-Bibliothek und es funktionierte, aber es ist nicht so schnell. Ich möchte die Eventlet-Bibliothek verwenden, aber ich weiß nicht, wie ich mein Problem beheben kann.

Antwort

0

Okay, fand ich die Lösung:

In der Tat wurde der Schlaf von Zeit Bibliothek in Python blockiert meine Buchse Throught die GUI. Um dieses Problem zu lösen, musste ich die Sleep-Funktion aus der Eventlet-Bibliothek wie folgt verwenden:

import sleep from eventlet