サーバーワーカー - Uvicorn with Workers¶
以前のデプロイメントの概念を再確認しましょう
- セキュリティ - 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.
ここでの唯一の新しいオプションは、Uvicornに4つのワーカープロセスを起動するように指示する--workers
です。
また、各プロセスのPIDが表示されていることがわかります。親プロセス(これはプロセスマネージャー)の27365
と、各ワーカープロセスの27368
、27369
、27370
、および27367
です。
デプロイのコンセプト¶
ここでは、複数のワーカーを使用して、アプリケーションの実行を並列化し、CPUの複数のコアを活用し、より多くのリクエストを処理する方法を見ました。
上記のデプロイメントの概念のリストから、ワーカーを使用することは主にレプリケーションの部分に役立ち、再起動にも少し役立ちますが、他の部分については依然として考慮する必要があります
- セキュリティ - HTTPS
- 起動時の実行
- 再起動
- レプリケーション(実行中のプロセス数)
- メモリ
- 起動前の事前準備
コンテナとDocker¶
コンテナ内のFastAPI - Dockerに関する次の章では、他のデプロイメントの概念を処理するために使用できるいくつかの戦略を説明します。
単一のUvicornプロセスを実行するために、独自のイメージをゼロから構築する方法を説明します。これは簡単なプロセスであり、Kubernetesのような分散コンテナ管理システムを使用する場合に望ましいことでしょう。
まとめ¶
fastapi
またはuvicorn
コマンドで--workers
CLIオプションを使用して、複数のワーカープロセスを使用することで、マルチコアCPUを活用し、複数のプロセスを並列に実行できます。
他のデプロイメントの概念を自分で考慮しながら、独自のデプロイメントシステムをセットアップしている場合は、これらのツールとアイデアを使用できます。
コンテナ(例: DockerとKubernetes)でFastAPIについて学ぶには、次の章をご覧ください。これらのツールが他のデプロイメントの概念も解決する簡単な方法を持っていることがわかります。✨