Flaskを使用してアプリを構築していますが、WSGIについてはあまり知りません。これはHTTPベースのWerkzeugです。 gunicornと4つのワーカープロセスでFlaskアプリケーションの提供を開始するとき、これは4つの同時要求を処理できることを意味しますか?
私は同時要求を意味し、1秒あたりの要求などではありません。
app.run()
を実行する開発サーバーを実行すると、単一の同期プロセスを取得します。つまり、一度に処理されるリクエストは最大で1つです。
デフォルト設定でGunicornをその前に置き、--workers
の数を増やすだけで、基本的に、それぞれがapp.run()
開発サーバーのように動作する多数のプロセス(Gunicornが管理)が得られます。 4ワーカー== 4同時要求。これは、Gunicornがデフォルトで含まれるsync
ワーカータイプを使用するためです。
Gunicornには、非同期ワーカー、つまりeventlet
およびgevent
(およびtornado
も含まれていますが、Tornadoフレームワークで最もよく使用されるようです)に注意することが重要です。これらの非同期ワーカーの1つを--worker-class
フラグで指定すると、Gunicornは多くの非同期プロセスを管理します、各管理独自の並行性。これらのプロセスはスレッドを使用せず、代わりにコルーチンを使用します。基本的に、各プロセス内では、一度に1つの事柄(1スレッド)しか発生しませんが、オブジェクトが外部プロセスの終了を待機している場合(データベースクエリを検討するか、ネットワークI/Oを待機している場合)、オブジェクトを「一時停止」できます。
つまり、Gunicornの非同期ワーカーの1つを使用している場合、各ワーカーは一度に1つ以上のリクエストを処理できます。最適なワーカー数は、アプリの性質、その環境、実行するハードウェアなどによって異なります。詳細については、 Gunicornのデザイン ページおよび geventの注意事項を参照してください。 works その紹介ページで。
Flaskはスレッドごとに同時に1つのリクエストを処理します。それぞれ4つのスレッドを持つ2つのプロセスがある場合、8つの同時要求になります。
Flaskは、スレッドまたはプロセスを生成または管理しません。それがWSGIゲートウェイ(例:gunicorn)の責任です。
現在、既に提供されているものよりもはるかに簡単なソリューションがあります。アプリケーションを実行するときは、次のように、threaded=True
パラメーターをapp.run()
呼び出しに渡すだけです。
app.run(Host="your.Host", port=4321, threaded=True)
werkzeug docs で確認できる別のオプションは、processes
パラメーターを使用することです。このパラメーターは、処理する同時プロセスの最大数を示す1より大きい数を受け取ります。
- スレッド化-プロセスは各リクエストを個別のスレッドで処理する必要がありますか?
- プロセス-1より大きい場合、この最大同時プロセス数までの新しいプロセスで各要求を処理します。
何かのようなもの:
app.run(Host="your.Host", port=4321, processes=3) #up to 3 processes
run()
メソッドの詳細情報 here 、および ブログ投稿 により、ソリューションとAPIリファレンスが見つかりました。
いいえ、それ以上のことは間違いなく処理できます。
シングルコアマシンを実行していると仮定すると、CPUは実際には一度に1つの命令だけを実行することに注意してください。
つまり、CPUは非常に限られた命令セットのみを実行でき、クロックティックごとに複数の命令を実行することはできません(多くの命令は1ティック以上もかかります)。
したがって、コンピューターサイエンスで私たちが話しているほとんどの並行性は、ソフトウェアの並行性です。言い換えれば、最下位レベルのCPUを私たちから抽象化し、同時にコードを実行していると思わせるソフトウェア実装の層があります。
これらの「もの」はプロセスである場合があります。これは、各プロセスが独自の非共有メモリで独自の世界で実行されていると考えるという意味で同時に実行されるコードの単位です。
別の例はスレッドです。スレッドは、並行処理を可能にするプロセス内のコードの単位です。
4つのワーカープロセスが4つ以上のリクエストを処理できるのは、より多くのリクエストを処理するためにスレッドを起動するためです。
実際の要求制限は、選択したHTTPサーバー、I/O、OS、ハードウェア、ネットワーク接続などに依存します。
幸運を!
*命令は、CPUが実行できる非常に基本的なコマンドです。例-2つの数値を追加し、1つの命令から別の命令にジャンプします