サーバーワーカー - Uvicornとワーカー¶
以前のデプロイコンセプトを再確認しましょう
- セキュリティ - HTTPS
- 起動時の実行
- 再起動
- レプリケーション(実行中のプロセス数)
- メモリ
- 起動前の事前準備
これまでのところ、ドキュメントのすべてのチュートリアルでは、おそらくUvicornを実行し、単一プロセスを実行するfastapiコマンドなどを使用して、サーバープログラムを実行してきました。
アプリケーションをデプロイする際には、複数のコアを活用し、より多くのリクエストを処理できるように、プロセスのレプリケーションを行うのが一般的です。
デプロイコンセプトに関する前の章で見たように、複数の戦略を使用できます。
ここでは、fastapiコマンドまたはuvicornコマンドを直接使用して、Uvicornをワーカープロセスとともに使用する方法を説明します。
情報
DockerやKubernetesなどのコンテナを使用している場合は、次の章「コンテナ内のFastAPI - Docker」で詳しく説明します。
特に、Kubernetesで実行している場合、ワーカーを使用するのを望まない場合が多く、代わりにコンテナごとに単一のUvicornプロセスを実行することになるでしょうが、その章で後ほど説明します。
複数のワーカー¶
--workersコマンドラインオプションを使用して複数のワーカーを起動できます
fastapiコマンドを使用する場合
$ <font color="#4E9A06">fastapi</font> run --workers 4 <u style="text-decoration-style:solid">main.py</u>
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting production server 🚀
Searching for package file structure from directories with
<font color="#3465A4">__init__.py</font> files
Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>
<span style="background-color:#007166"><font color="#D3D7CF"> module </font></span> 🐍 main.py
<span style="background-color:#007166"><font color="#D3D7CF"> code </font></span> Importing the FastAPI app object from the module with the
following code:
<u style="text-decoration-style:solid">from </u><u style="text-decoration-style:solid"><b>main</b></u><u style="text-decoration-style:solid"> import </u><u style="text-decoration-style:solid"><b>app</b></u>
<span style="background-color:#007166"><font color="#D3D7CF"> app </font></span> Using import string: <font color="#3465A4">main:app</font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Server started at <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000</u></font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Documentation at <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000/docs</u></font>
Logs:
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Uvicorn running on <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000</u></font> <b>(</b>Press CTRL+C to
quit<b>)</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started parent process <b>[</b><font color="#34E2E2"><b>27365</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>27368</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>27369</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>27370</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>27367</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
uvicornコマンドを直接使用したい場合
$ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
<font color="#A6E22E">INFO</font>: Uvicorn running on <b>http://0.0.0.0:8080</b> (Press CTRL+C to quit)
<font color="#A6E22E">INFO</font>: Started parent process [<font color="#A1EFE4"><b>27365</b></font>]
<font color="#A6E22E">INFO</font>: Started server process [<font color="#A1EFE4">27368</font>]
<font color="#A6E22E">INFO</font>: Waiting for application startup.
<font color="#A6E22E">INFO</font>: Application startup complete.
<font color="#A6E22E">INFO</font>: Started server process [<font color="#A1EFE4">27369</font>]
<font color="#A6E22E">INFO</font>: Waiting for application startup.
<font color="#A6E22E">INFO</font>: Application startup complete.
<font color="#A6E22E">INFO</font>: Started server process [<font color="#A1EFE4">27370</font>]
<font color="#A6E22E">INFO</font>: Waiting for application startup.
<font color="#A6E22E">INFO</font>: Application startup complete.
<font color="#A6E22E">INFO</font>: Started server process [<font color="#A1EFE4">27367</font>]
<font color="#A6E22E">INFO</font>: Waiting for application startup.
<font color="#A6E22E">INFO</font>: Application startup complete.
ここでの唯一の新しいオプションは--workersで、Uvicornに4つのワーカープロセスを開始するように指示しています。
各プロセスのPIDが表示されていることも確認できます。親プロセス(これはプロセスマネージャー)の27365と、各ワーカープロセスの27368、27369、27370、27367です。
デプロイのコンセプト¶
ここでは、複数のワーカーを使用してアプリケーションの実行を並列化し、CPUの複数のコアを活用してより多くのリクエストを処理する方法を見ました。
上記のデプロイコンセプトのリストから、ワーカーの使用は主にレプリケーションの部分に役立ち、再起動にも多少役立ちますが、他の部分については依然として対処する必要があります
- セキュリティ - HTTPS
- 起動時の実行
- 再起動
- レプリケーション(実行中のプロセス数)
- メモリ
- 起動前の事前準備
コンテナとDocker¶
次の章「コンテナ内のFastAPI - Docker」では、他のデプロイコンセプトを処理するために使用できるいくつかの戦略について説明します。
単一のUvicornプロセスを実行するために独自のイメージをゼロから構築する方法を説明します。これは簡単なプロセスであり、Kubernetesのような分散コンテナ管理システムを使用する場合に望むことでしょう。
まとめ¶
fastapiまたはuvicornコマンドで--workers CLIオプションを使用して、複数のワーカープロセスを使用し、マルチコアCPUを活用して複数のプロセスを並列で実行できます。
他のデプロイコンセプトを自分で処理しながら、独自のデプロイシステムをセットアップしている場合は、これらのツールとアイデアを使用できます。
コンテナ(例: DockerとKubernetes)でのFastAPIについて学ぶために次の章を確認してください。これらのツールが他のデプロイコンセプトも簡単に解決する方法があることがわかるでしょう。✨