Ich versuche eine minimale Flask-Anwendung zu erstellen, die eventlet verwendet, um sofort auf gleichzeitige Anfragen zu antworten, anstatt eine Anfrage zu blockieren und zu beantworten andere (wie der standard Flask Debugging Webserver tut).
Voraussetzungen:
%Vor%Nach meinem Verständnis von dem, was ich bisher im Internet gefunden habe, sollte es so funktionieren:
%Vor% Wenn ich diese Datei öffne, http://localhost:5000/longTask
in einem Webbrowser Tab öffne und noch während der Verarbeitung ein anderes Tab mit http://localhost:5000/shortTask
öffne, würde ich erwarten, dass das zweite Tab sofort zurückkehrt, während das erste Tab 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 ist.
Was ist hier falsch? Wäre das übrigens ein sogenannter "production ready webserver" für Flask, wenn man davon ausgeht, dass nur wenige gleichzeitige Benutzer zu erwarten sind (höchstens 5)?
Übrigens, wenn ich die Flask-socketio-Bibliothek verwende, um den Webserver auszuführen, der laut Die Dokumentation wählt automatisch Eventlet, wenn es installiert ist, dann funktioniert es wie erwartet.
Komplettes Beispiel mit Flask-socketio:
%Vor% Wenn Sie app.run(debug=True)
ausführen, erklären Sie Flask ausdrücklich, Ihre Anwendung auf dem Entwicklungs-Web-Server auszuführen, der auf Werkzeug basiert. Es spielt keine Rolle, dass Sie Eventlet geladen haben.
Wenn Sie Ihre Anwendung auf dem Eventlet-Webserver ausführen möchten, müssen Sie einen Eventlet-Webserver starten, der laut Die Dokumentation wird wie folgt gestartet:
%Vor% Das ist mehr oder weniger das, was socketio.run()
in meiner Flask-SocketIO-Erweiterung tut, mit ein bisschen mehr Komplexität, um SSL optional zu handhaben. Die Codezeilen, die dies tun, sind: Ссылка init .py # L391-L408 . Wenn Sie sich diese Zeilen ansehen, werden Sie sehen, dass es drei verschiedene Start-up-Codestücke gibt, einen für das Werkzeug, einen für das Eventlet und einen für das Gevent. Sie sind alle verschieden.
Verwandelt Ihren Code nicht magisch in ein Multithread-Biest, das Anfragen asynchron verarbeiten kann (es ist immer noch ziemlich magisch und fantastisch).
Wie Sie in diesem Beispiel sehen können, müssen Sie den Server wsgi
mit
Wenn Sie eine Standardlösung wünschen, sehen Sie sich an, wie Sie nginx und uwsgi zum Starten von flash-Anwendungen verwenden. Sie könnten auch an dem Projekt Spawning interessiert sein, das den Aufwand für die Erstellung eines vollständigen Multithread-Wsgi-Handlers nutzt.
Tags und Links python flask eventlet flask-socketio