web-dev-qa-db-ja.com

Flask app.run()をスタンドアロンとして使用して複数のクライアントにサービスを提供できますか?

FlaskをApacheや他のWebサーバーとリンクできることは知っています。しかし、私はFlaskを同時に複数のクライアントにサービスを提供するスタンドアロンサーバーとして実行することを考えていました。

これは可能ですか?複数のスレッドを生成して管理する必要がありますか。

172
ATOzTOA

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のドキュメントの題名の章を参照)。 デプロイオプション いくつかの推奨された方法について)。

247
Sean Vieira

Flask内から単純なapp.run()を使用すると、一度に1つのクライアントのみにサービスを提供できるシングルスレッド上に単一の同期サーバーが作成されます。まさにこの理由のためにそれは需要の少ない制御された環境(すなわち開発、デバッグ)での使用を意図しています。

Python GIL のため、スレッドを生成して自分で管理しても、おそらくそれほど遠くへ行くことはないでしょう。

とは言っても、あなたにはまだいくつかの良い選択肢があります。 Gunicorn は堅牢で使いやすいWSGIサーバーで、複数のワーカーを生成することができ(別々のプロセスなのでGILの心配はありません)、 非同期のワーカー that (特にFlaskを使って)ほとんど何もしないで、あなたのアプリをスピードアップ(そしてより安全に)します。

それでも、Gunicornでさえ直接公に暴露されるべきではないでしょう。本番環境では、より堅牢なHTTPサーバーの背後で使用する必要があります。 nginx GunicornやFlaskとうまく合う傾向があります。

55
Ryan Artecona