Reagieren auf gleichzeitige Anfragen mit Flask und Eventlet

8

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%     
Dirk 11.01.2016, 13:02
quelle

2 Antworten

11

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.

    
Miguel 12.01.2016, 15:33
quelle
2
%Vor%

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 eventlet wsgi-Implementierung .

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.

    
Cyrbil 11.01.2016 13:25
quelle