web-dev-qa-db-ja.com

マルチスレッドモードでGunicornを使用してFlaskを実行する方法

Flaskで書かれたWebアプリケーションがあります。誰もが示唆するように、私はFlaskを本番環境で使用することはできません。だから私はGunicorn with Flaskと考えました。

Flaskアプリケーション私はいくつかの機械学習モデルをロードしています。これらは合計8GBのサイズです。私のWebアプリケーションの同時実行は1000リクエストになります。そしてRAMは15GBです。
では、このアプリケーションを実行する最良の方法は何ですか?

21
neel

複数のワーカーでアプリを起動したり、Gunicornで非同期ワーカーを起動したりできます。

フラスコserver.py

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

Gevent非同期ワーカーを持つGunicorn

gunicorn server:app -k gevent --worker-connections 1000

Gunicorn 1ワーカー12スレッド:

gunicorn server:app -w 1 --threads 12

4つのワーカーを持つGunicorn(マルチプロセッシング):

gunicorn server:app -w 4

Flask=この投稿の同時実行性に関する詳細: 単一のFlaskプロセスが受信する同時リクエストの数

34
molivier

最善の方法は、プリフォークモードを使用することです( preload_app = True )。これにより、「マスター」プロセスでコードが初期化され、ワー​​カープロセスを分岐してリクエストを処理します。 Linuxで実行しており、モデルが読み取り専用であると想定している場合、OSはすべてのプロセス間で物理メモリを再利用できるほどスマートです。

3
slushi