2016-06-13 10 views
0

Ich habe eine Flask-Ansicht, die schläft, während eine Antwort generiert, um eine lange Anfrage für einen Web-Service zu simulieren. Ich betreibe den Dev-Server mit threaded=True. Wenn Sie drei Registerkarten im Browser öffnen, werden auf der zweiten Registerkarte bis zum Abschluss des ersten Befehls keine Aktualisierungen angezeigt. Aber die dritte Registerkarte startet, bevor die zweite beendet ist. Ich habe das gleiche mit processes=4 statt threaded=True erlebt. Warum scheinen andere Threads auf den ersten zu warten?Flask-Dev-Server im Thread-Modus wartet immer noch auf den ersten Thread

import sys 
from flask import Flask, Response 

PORT = 5002 
SECONDS = 20 

# create app 
app = Flask(__name__) 
app.config.from_object(__name__) 

@app.route('/wait') 
def wait(): 
    def generate(): 
     for i in range(SECONDS + 1): 
      if i == 0: 
       yield "<html><body>Getting data: <pre>" 
      import time 
      time.sleep(1) 
      if i < SECONDS: 
       print "tick" 
       yield "." 
      else: 
       yield "Finished after %ss.</pre></body></html>" % SECONDS 
    return Response(generate(), mimetype="text/html") 

def runserver(): 
    app.run(host='0.0.0.0', port=PORT, threaded=True) 

if __name__ == '__main__': 
    runserver() 

Antwort

0

Das Problem scheint der Browser zu sein. Beim Testen mit Google Chrome bekomme ich das in der Frage beschriebene Verhalten: Der zweite Thread startet nicht, bevor der erste fertig ist.

Testing mit:

wget -qO- http://localhost:5002/wait 

erlebe ich die richtige Antwort. Jede Konsole zeigt sofort die Ausgabe an.