Ich versuche eine minimale Flask-Anwendung zu erstellen, die eventlet verwendet, um auf gleichzeitige Anfragen sofort zu reagieren, statt zu blockieren und auf eine Anfrage nach der anderen zu antworten (wie der standard Flask Debugging Webserver tut).Reagieren auf gleichzeitige Anfragen mit Flask und Eventlet
Voraussetzungen:
pip install Flask
pip install eventlet
Von meinem Verständnis von dem, was ich bisher im Internet zu finden, sollte es so funktionieren:
# activate eventlet
import eventlet
eventlet.monkey_patch()
from flask import Flask
import datetime
from time import sleep
# create a new Flask application
app = Flask(__name__)
# a short running task that returns immediately
@app.route('/shortTask')
def short_running_task():
start = datetime.datetime.now()
return 'Started at {0}, returned at {1}'.format(start, datetime.datetime.now())
# a long running tasks that returns after 30s
@app.route('/longTask')
def long_running_task():
start = datetime.datetime.now()
sleep(30)
return 'Started at {0}, returned at {1}'.format(start, datetime.datetime.now())
# run the webserver
if __name__ == '__main__':
app.run(debug=True)
Wenn diese Datei ausgeführt wird, dann http://localhost:5000/longTask
in einem Web-Browser öffnen Registerkarte und während es noch verarbeitet Öffnen eines anderen Tab mit http://localhost:5000/shortTask
, würde ich erwarten, dass die zweite Registerkarte sofort zurück, während die erste Registerkarte noch geladen wird. Ähnlich wie bei der Ausführung auf dem Standard-Werkzeug-Server von Server kehrt die zweite Registerkarte jedoch nur zurück, nachdem die erste nach 30 Sekunden beendet wurde.
Was ist hier falsch? By the way, das, was gegeben wird, würde üblicherweise bezeichnet als „Produktion bereit Webserver“ für Flask, dass es nur wenige gleichzeitige Benutzer sind (höchstens 5) zu erwarten?
Übrigens, wenn ich the Flask-socketio library benutze, um den Webserver zu starten, der, entsprechend der Dokumentation, automatisch eventlet auswählt, wenn es installiert ist, dann funktioniert es wie erwartet.
Komplettes Beispiel mit Flask-socketio:
# activate eventlet
import eventlet
eventlet.monkey_patch()
from flask import Flask
from flask_socketio import SocketIO
import datetime
from time import sleep
# create a new Flask application
app = Flask(__name__)
# activate Flask-socketio
socketio = SocketIO(app)
# a short running task that returns immediately
@app.route('/shortTask')
def short_running_task():
start = datetime.datetime.now()
return 'Started at {0}, returned at {1}'.format(start, datetime.datetime.now())
# a long running tasks that returns after 30s
@app.route('/longTask')
def long_running_task():
start = datetime.datetime.now()
sleep(30)
return 'Started at {0}, returned at {1}'.format(start, datetime.datetime.now())
# run the webserver with socketio
if __name__ == '__main__':
socketio.run(app, debug=True)
Ausgezeichnet! Das Flask-App-Objekt an den 'wsgi.server'-Befehl übergeben zu müssen, war mir aus dem Beispiel in den Eventlet-Dokumenten nicht klar, daher war dieses Flask-basierte Beispiel sehr hilfreich. – Dirk