flask.Flask.run
akzeptiert zusätzliche Schlüsselwortargumente ( **options
), an die weitergeleitet wird werkzeug.serving.run_simple
- zwei dieser Argumente sind threaded
(ein Boolescher Wert) undprocesses
Wert (die Sie auf eine Zahl größer als eins setzen können, damit werkzeug mehr als einen Prozess zur Bearbeitung von Anforderungen erzeugt).
threaded
Standardwerte True
wie von Flask 1.0, so dass für die neuesten Versionen von Flask, wird die Standard - Entwicklungs - Server mehrere Clients gleichzeitig standardmäßig dienen können. Bei älteren Versionen von Flask können Sie explizit übergeben threaded=True
, um dieses Verhalten zu aktivieren.
Zum Beispiel können Sie tun
if __name__ == '__main__':
app.run(threaded=True)
um mehrere Clients mithilfe von Threads auf eine Weise zu behandeln, die mit alten Flask-Versionen kompatibel ist, oder
if __name__ == '__main__':
app.run(threaded=False, processes=3)
Werkzeug anzuweisen, drei Prozesse zu erzeugen, um eingehende Anfragen zu verarbeiten, oder einfach
if __name__ == '__main__':
app.run()
um mehrere Clients mithilfe von Threads zu behandeln, wenn Sie wissen, dass Sie Flask 1.0 oder höher verwenden werden.
Davon abgesehen serving.run_simple
verpackt Werkzeug's das wsgiref
Paket der Standardbibliothek - und dieses Paket enthält eine Referenzimplementierung von WSGI, keinen produktionsbereiten Webserver. Wenn Sie Flask in der Produktion verwenden möchten (vorausgesetzt, "Produktion" ist keine verkehrsarme interne Anwendung mit nicht mehr als 10 gleichzeitigen Benutzern), stellen Sie sicher, dass Sie sie hinter einem echten Webserver aufstellen (siehe den Abschnitt in den Dokumenten von Flask mit dem Titel) Bereitstellungsoptionen für einige vorgeschlagene Methoden).
processes=100
und damit zufrieden sein? In meinem Fall benötige ich nur statische Dateien, keine HTTP-Post-Methoden. Meine Anforderung ist, dass ich alle Flask-Threads als Teil meiner übergeordneten App ausführen möchte, damit sie alle Variablen gemeinsam nutzen können.Durch die Verwendung von simple
app.run()
from Flask wird ein einzelner synchroner Server auf einem einzelnen Thread erstellt, der jeweils nur einen Client bedienen kann. Genau aus diesem Grund ist es für den Einsatz in kontrollierten Umgebungen mit geringer Nachfrage (dh Entwicklung, Debugging) vorgesehen.Das Laichen und Verwalten von Threads wird Sie aufgrund der Python-GIL wahrscheinlich auch nicht sehr weit bringen .
Trotzdem haben Sie noch einige gute Möglichkeiten. Gunicorn ist ein solider, benutzerfreundlicher WSGI-Server, mit dem Sie mehrere Worker erzeugen können (separate Prozesse, also keine GIL-Sorgen), und der sogar mit asynchronen Workern geliefert wird , die Ihre App mit wenig beschleunigen (und sicherer machen) zu keiner Arbeit von Ihrer Seite (besonders mit Flask).
Dennoch sollte selbst Gunicorn wahrscheinlich nicht direkt öffentlich ausgesetzt werden. In der Produktion sollte es hinter einem robusteren HTTP-Server verwendet werden. nginx neigt dazu , mit Gunicorn und Kolben gut zu gehen.
quelle
gunicorn app:app 127.0.0.1:8080
statt ausführenpython app.py
. Nginx fungiert als öffentlicher Dienst, der Ihre private, von Gunicorn ausgeführte App (einen Reverse-Proxy) verfügbar macht und alle möglichen Details der HTTP-Implementierung auf niedrigerer Ebene