FlaskをApacheや他のWebサーバーとリンクできることは知っています。しかし、私はFlaskを同時に複数のクライアントにサービスを提供するスタンドアロンサーバーとして実行することを考えていました。
これは可能ですか?複数のスレッドを生成して管理する必要がありますか。
flask.Flask.run
追加のキーワード引数(**options
)を受け取ります werkzeug.serving.run_simple
- これらの引数のうち2つはthreaded
(スレッド化を有効にするためにTrue
に設定できます)とprocesses
(これは自分です) werkzeugがリクエストを処理するために複数のプロセスを生成するようにするために1より大きい数に設定することができます。もしそうなら:
if __== '__main__':
app.run(threaded=True)
# Alternately
# app.run(processes=3)
Flaskは、Werkzeugにスレッドを使用し、着信要求を処理するために3つのプロセスを生成するように指示します。
そうは言っても、Werkzeugのserving.run_simple
は標準ライブラリの wsgiref
パッケージをラップしており、そのパッケージには本番用のWebサーバーではなく、WSGIの参照実装が含まれています。 Flaskを本番環境で使用する場合( "production"は10人以下の同時ユーザーを持つトラフィックの少ない内部アプリケーションではないと仮定して)、本物のWebサーバーの後ろに立ち上がるようにしてください(Flaskのドキュメントの題名の章を参照)。 デプロイオプション いくつかの推奨された方法について)。
Flask内から単純なapp.run()
を使用すると、一度に1つのクライアントのみにサービスを提供できるシングルスレッド上に単一の同期サーバーが作成されます。まさにこの理由のためにそれは需要の少ない制御された環境(すなわち開発、デバッグ)での使用を意図しています。
Python GIL のため、スレッドを生成して自分で管理しても、おそらくそれほど遠くへ行くことはないでしょう。
とは言っても、あなたにはまだいくつかの良い選択肢があります。 Gunicorn は堅牢で使いやすいWSGIサーバーで、複数のワーカーを生成することができ(別々のプロセスなのでGILの心配はありません)、 非同期のワーカー that (特にFlaskを使って)ほとんど何もしないで、あなたのアプリをスピードアップ(そしてより安全に)します。
それでも、Gunicornでさえ直接公に暴露されるべきではないでしょう。本番環境では、より堅牢なHTTPサーバーの背後で使用する必要があります。 nginx GunicornやFlaskとうまく合う傾向があります。