it-swarm.com.de

Kann ich mehrere Clients bedienen, indem ich nur Flask app.run () als Standalone verwende?

Ich weiß, dass ich Flask mit Apache oder anderen Webservern verknüpfen kann. Aber ich wollte Flask als eigenständigen Server ausführen, der mehrere Clients gleichzeitig bedient.

Ist das möglich? Muss ich mehrere Threads erzeugen und verwalten?

173
ATOzTOA

flask.Flask.run akzeptiert zusätzliche Schlüsselwortargumente (**options) dass es weiterleitet an werkzeug.serving.run_simple - Zwei dieser Argumente sind threaded (das Sie auf True setzen können, um das Threading zu aktivieren) und processes (das Sie auf eine Zahl größer als setzen können ein werkzeug mehr als einen prozess erzeugen zu lassen, um anfragen zu bearbeiten). Also wenn du tust:

if __== '__main__':
    app.run(threaded=True)
    # Alternately
    # app.run(processes=3)

Flask weist Werkzeug an, Threading zu verwenden und drei Prozesse für die Bearbeitung eingehender Anforderungen zu erzeugen.

Davon abgesehen ist Werkzeugs serving.run_simple umschließt das wsgiref -Paket der Standardbibliothek, und dieses Paket enthält eine Referenzimplementierung von WSGI und keinen produktionsbereiten Webserver. Wenn Sie Flask in der Produktion verwenden möchten (vorausgesetzt, dass "Produktion" keine verkehrsarme interne Anwendung mit nicht mehr als 10 gleichzeitigen Benutzern ist), stellen Sie sicher, dass sie sich hinter einem echten Web befindet Server (einige vorgeschlagene Methoden finden Sie im Abschnitt Flask's docs mit dem Titel Deployment Options ).

253
Sean Vieira

Durch die Verwendung der einfachen Funktion app.run() innerhalb von Flask) wird ein einzelner synchroner Server auf einem einzelnen Thread erstellt, der jeweils nur einen Client bedienen kann Aus genau diesem Grund ist die Nachfrage gering (z. B. Entwicklung, Debugging).

Das Spawnen und Verwalten von Threads selbst wird Sie wahrscheinlich auch nicht sehr weit bringen, da the Python GIL .

Das heißt, Sie haben noch einige gute Möglichkeiten. Gunicorn ist ein solider, benutzerfreundlicher WSGI-Server, mit dem Sie mehrere Worker erzeugen können (getrennte Prozesse, keine GIL-Probleme) und der sogar asynchrone Worker enthält beschleunigt Ihre App (und macht sie sicherer) mit wenig oder gar keiner Arbeit von Ihrer Seite (insbesondere mit Flask).

Dennoch sollte selbst Gunicorn wahrscheinlich nicht direkt öffentlich exponiert werden. In der Produktion sollte es hinter einem robusteren HTTP-Server verwendet werden. Nginx passt gut zu Gunicorn und Flask.

59
Ryan Artecona