サーバーワーカー - Uvicornとワーカー¶
前のデプロイメントの概念を振り返ってみましょう
- セキュリティ - HTTPS
- 起動時に実行
- 再起動
- レプリケーション(実行中のプロセスの数)
- メモリ
- 開始前の準備
ここまでのドキュメントのチュートリアルでは、おそらくfastapi
コマンドを使用して、Uvicornを実行するサーバープログラムを、単一プロセスで実行していたでしょう。
アプリケーションをデプロイするときは、おそらく複数コアを活用し、より多くのリクエストを処理できるように、プロセスのレプリケーションが必要になります。
前のデプロイメントの概念の章で見たように、複数の戦略を使用できます。
ここでは、fastapi
コマンドまたはuvicorn
コマンドを直接使用して、ワーカープロセスでUvicornを使用する方法を示します。
情報
DockerやKubernetesなどのコンテナを使用している場合は、次の章「コンテナでのFastAPI - Docker」で詳しく説明します。
特に、Kubernetesで実行している場合は、ワーカーを使用せずに、コンテナごとに単一のUvicornプロセスを実行することをお勧めします。これについては、後の章で説明します。
複数のワーカー¶
--workers
コマンドラインオプションを使用して、複数のワーカーを開始できます。
fastapi
コマンドを使用する場合
$ <pre> <font color="#4E9A06">fastapi</font> run --workers 4 <u style="text-decoration-style:single">main.py</u>
<font color="#3465A4">INFO </font> Using path <font color="#3465A4">main.py</font>
<font color="#3465A4">INFO </font> Resolved absolute path <font color="#75507B">/home/user/code/awesomeapp/</font><font color="#AD7FA8">main.py</font>
<font color="#3465A4">INFO </font> Searching for package file structure from directories with <font color="#3465A4">__init__.py</font> files
<font color="#3465A4">INFO </font> Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>
╭─ <font color="#8AE234"><b>Python module file</b></font> ─╮
│ │
│ 🐍 main.py │
│ │
╰──────────────────────╯
<font color="#3465A4">INFO </font> Importing module <font color="#4E9A06">main</font>
<font color="#3465A4">INFO </font> Found importable FastAPI app
╭─ <font color="#8AE234"><b>Importable FastAPI app</b></font> ─╮
│ │
│ <span style="background-color:#272822"><font color="#FF4689">from</font></span><span style="background-color:#272822"><font color="#F8F8F2"> main </font></span><span style="background-color:#272822"><font color="#FF4689">import</font></span><span style="background-color:#272822"><font color="#F8F8F2"> app</font></span><span style="background-color:#272822"> </span> │
│ │
╰──────────────────────────╯
<font color="#3465A4">INFO </font> Using import string <font color="#8AE234"><b>main:app</b></font>
<font color="#4E9A06">╭─────────── FastAPI CLI - Production mode ───────────╮</font>
<font color="#4E9A06">│ │</font>
<font color="#4E9A06">│ Serving at: http://0.0.0.0:8000 │</font>
<font color="#4E9A06">│ │</font>
<font color="#4E9A06">│ API docs: http://0.0.0.0:8000/docs │</font>
<font color="#4E9A06">│ │</font>
<font color="#4E9A06">│ Running in production mode, for development use: │</font>
<font color="#4E9A06">│ │</font>
<font color="#4E9A06">│ </font><font color="#8AE234"><b>fastapi dev</b></font><font color="#4E9A06"> │</font>
<font color="#4E9A06">│ │</font>
<font color="#4E9A06">╰─────────────────────────────────────────────────────╯</font>
<font color="#4E9A06">INFO</font>: Uvicorn running on <b>http://0.0.0.0:8000</b> (Press CTRL+C to quit)
<font color="#4E9A06">INFO</font>: Started parent process [<font color="#34E2E2"><b>27365</b></font>]
<font color="#4E9A06">INFO</font>: Started server process [<font color="#06989A">27368</font>]
<font color="#4E9A06">INFO</font>: Waiting for application startup.
<font color="#4E9A06">INFO</font>: Application startup complete.
<font color="#4E9A06">INFO</font>: Started server process [<font color="#06989A">27369</font>]
<font color="#4E9A06">INFO</font>: Waiting for application startup.
<font color="#4E9A06">INFO</font>: Application startup complete.
<font color="#4E9A06">INFO</font>: Started server process [<font color="#06989A">27370</font>]
<font color="#4E9A06">INFO</font>: Waiting for application startup.
<font color="#4E9A06">INFO</font>: Application startup complete.
<font color="#4E9A06">INFO</font>: Started server process [<font color="#06989A">27367</font>]
<font color="#4E9A06">INFO</font>: Waiting for application startup.
<font color="#4E9A06">INFO</font>: Application startup complete.
</pre>
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について学ぶには、次の章をご覧ください。これらのツールには、他のデプロイメントの概念も解決する簡単な方法があることがわかります。 ✨