私はFlaskを使用してアプリを構築していますが、WSGIとそのHTTPベースであるWerkzeugについてはよくわかりません。gunicornと4つのワーカープロセスでFlaskアプリケーションの提供を開始した場合、これは4つの同時リクエストを処理できることを意味しますか?
私は同時リクエストを意味し、1秒あたりのリクエストなどではありません。
開発サーバーを実行すると (これは を実行することで得られますapp.run()
)、単一の同期プロセスが得られます。つまり、一度に最大 1 つの要求が処理されます。
Gunicorn をデフォルト構成でその前に貼り付け、単純に の数を増やすと、基本的に、それぞれが開発サーバー--workers
のように動作する (Gunicorn によって管理される) プロセスの数が得られます。app.run()
4 ワーカー == 4 つの同時リクエスト。これは、Gunicorn がsync
デフォルトで含まれているワーカー タイプを使用するためです。
Gunicorn には非同期ワーカー、つまりeventlet
andも含まれていることに注意することが重要ですgevent
(またtornado
、Tornado フレームワークで使用するのが最適なようです)。これらの非同期ワーカーの 1 つを--worker-class
フラグで指定すると、Gunicorn が多数の非同期プロセスを管理し、それぞれが独自の同時実行を管理します。これらのプロセスはスレッドを使用せず、代わりにコルーチンを使用します。基本的に、各プロセス内では、一度に 1 つのこと (1 スレッド) しか発生できませんが、オブジェクトは、外部プロセスが終了するのを待っているときに「一時停止」することができます (データベース クエリまたはネットワーク I/O を待機していると考えてください)。
これは、Gunicorn の非同期ワーカーの 1 つを使用している場合、各ワーカーが一度に複数のリクエストを処理できることを意味します。最適なワーカーの数は、アプリの性質、環境、実行するハードウェアなどによって異なります。詳細については、Gunicornのデザインページを参照してください。
Flask は、スレッドごとに 1 つのリクエストを同時に処理します。それぞれ 4 つのスレッドを持つ 2 つのプロセスがある場合、それは 8 つの同時要求です。
Flask は、スレッドやプロセスを生成または管理しません。これは、WSGI ゲートウェイ (gunicorn など) の責任です。
いいえ、それ以上は確実に処理できます。
シングルコアマシンを実行していると仮定すると、CPUは実際には一度に1つの命令*しか実行しないことを深く覚えておくことが重要です.
つまり、CPU は非常に限られた一連の命令しか実行できず、クロック ティックごとに複数の命令を実行することはできません (多くの命令は 1 ティックを超えることさえあります)。
したがって、コンピューター サイエンスで言及するほとんどの同時実行は、ソフトウェアの同時実行です。言い換えれば、最下位レベルの CPU を私たちから抽象化し、コードを同時に実行していると思わせるソフトウェア実装のレイヤーがあります。
これらの「もの」は、各プロセスが独自の非共有メモリを使用して独自の世界で実行されていると考えるという意味で、同時に実行されるコードの単位であるプロセスにすることができます。
もう 1 つの例はスレッドです。スレッドは、プロセス内のコードの単位であり、同時実行も可能です。
4 つのワーカー プロセスが 4 つを超えるリクエストを処理できる理由は、より多くのリクエストを処理するためにスレッドを起動するためです。
実際のリクエスト制限は、選択した HTTP サーバー、I/O、OS、ハードウェア、ネットワーク接続などによって異なります。
幸運を!
*命令は、CPU が実行できる非常に基本的なコマンドです。例 - 2 つの数値の加算、ある命令から別の命令へのジャンプ