回答:
flask.Flask.run
**options
転送先の追加のキーワード引数()を受け入れますwerkzeug.serving.run_simple
-これらの引数の2つはthreaded
(ブール値)とprocesses
(1より大きい数に設定して、要求を処理するために複数のプロセスを生成するためにwerkzeugを使用できます)。
threaded
デフォルトTrue
はFlask 1.0以降であるため、Flaskの最新バージョンでは、デフォルトの開発サーバーは複数のクライアントに同時にサービスを提供できます。Flaskの古いバージョンでは、threaded=True
この動作を有効にするために明示的に渡すことができます。
たとえば、次のことができます
if __name__ == '__main__':
app.run(threaded=True)
古いFlaskバージョンと互換性のある方法でスレッドを使用して複数のクライアントを処理する、または
if __name__ == '__main__':
app.run(threaded=False, processes=3)
着信リクエストを処理する3つのプロセスを生成するようにWerkzeugに指示するか、または単に
if __name__ == '__main__':
app.run()
Flask 1.0以降を使用することがわかっている場合は、スレッドを使用して複数のクライアントを処理します。
そうは言っても、Werkzeug serving.run_simple
は標準ライブラリのwsgiref
パッケージをラップしています。そのパッケージには、実稼働用のWebサーバーではなく、WSGIのリファレンス実装が含まれています。本番環境でFlaskを使用する場合(「本番環境」が同時ユーザー数が10以下の低トラフィックの内部アプリケーションではないと想定)、実際のWebサーバーの背後に立ち上がるようにしてください(Flaskのドキュメントのタイトルのセクションを参照してください)いくつかの推奨される方法の展開オプション)。
app.run()
Flask内からシンプルを使用すると、一度に1つのクライアントのみを処理できる単一のスレッド上に単一の同期サーバーが作成されます。これは、まさにこの理由により、要求の少ない制御された環境(つまり、開発、デバッグ)での使用を目的としています。
スレッドを生成して自分で管理しても、Python GILのため、おそらくそれほど遠くまでは行きません。
とはいえ、まだいくつかの良いオプションがあります。Gunicornは堅固で使いやすいWSGIサーバーであり、複数のワーカー(個別のプロセスであるため、GILは心配しません)を生成でき、非同期ワーカーも付属しているため、アプリの高速化(および安全性の向上)をほとんど必要としません(特にFlaskを使用して)自分の側で何もしないようにします。
それでも、Gunicornでさえ、直接公開されることはおそらくないでしょう。本番環境では、より堅牢なHTTPサーバーの背後で使用する必要があります。nginxはGunicornとFlaskによく合う傾向があります。
gunicorn app:app 127.0.0.1:8080
では、の代わりにアプリを実行できますpython app.py
。Nginxは、プライベートGunicorn実行アプリ(リバースプロキシ)を公開するパブリックサービスとして機能し、あらゆる種類の低レベルのHTTP実装の詳細を隠し、おそらく静的ファイルを直接提供するなど
processes=100
、それで満足できますか?私の場合、静的ファイルのみが必要で、HTTP Postメソッドは必要ありません。私の要件は、すべてのFlaskスレッドを親アプリの一部として実行して、変数をすべて共有できるようにすることです。