跳至內容

伺服器 Worker - 使用 Worker 運行 Uvicorn

讓我們回顧一下之前的部署概念

  • 安全性 - HTTPS
  • 開機啟動
  • 重新啟動
  • 複寫(運行的程序數量)
  • 記憶體
  • 啟動前的步驟

到目前為止,在所有文件中教學的過程中,您可能都在運行一個伺服器程式,例如,使用 fastapi 命令,它會運行 Uvicorn,運行一個單一程序

在部署應用程式時,您可能需要一些程序複寫來利用多核心並能夠處理更多請求。

正如您在上一章關於部署概念中所看到的,您可以使用多種策略。

在這裡,我將向您展示如何使用 fastapi 命令或直接使用 uvicorn 命令,讓Uvicorn搭配Worker 程序運行。

資訊

如果您正在使用容器,例如 Docker 或 Kubernetes,我將在下一章中詳細說明:容器中的 FastAPI - Docker

特別是,在Kubernetes 上運行時,您可能想使用 Worker,而是每個容器運行一個 Uvicorn 程序,但我會在該章稍後說明。

多個 Worker

您可以使用 --workers 命令列選項啟動多個 Worker

如果您使用 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.

這裡唯一的新選項是 --workers,它告訴 Uvicorn 啟動 4 個 Worker 程序。

您還可以看見它顯示了每個程序的PID,父程序(這是程序管理器)的 PID 為 27365,每個 Worker 程序各有一個 PID:27368273692737027367

部署概念

在這裡,您看到了如何使用多個Worker平行化應用程式的執行,利用 CPU 中的多核心,並能夠服務更多請求

從上面列出的部署概念來看,使用 Worker 主要有助於複寫部分,以及一點點重新啟動部分,但您仍然需要處理其他部分

  • 安全性 - HTTPS
  • 開機啟動
  • 重新啟動
  • 複寫(運行的程序數量)
  • 記憶體
  • 啟動前的步驟

容器和 Docker

在下一章關於容器中的 FastAPI - Docker中,我將解釋一些您可以用來處理其他部署概念的策略。

我將向您展示如何從頭開始構建您自己的映像檔來運行單個 Uvicorn 程序。這是一個簡單的過程,而且可能是您在使用像Kubernetes這樣的分散式容器管理系統時想要做的事情。

回顧

您可以使用 fastapiuvicorn 命令搭配 --workers 命令列選項來使用多個 Worker 程序,以利用多核心 CPU平行運行多個程序

如果您正在設置自己的部署系統,同時自行處理其他部署概念,則可以使用這些工具和想法。

查看下一章,了解關於使用容器(例如 Docker 和 Kubernetes)的FastAPI。您將看到這些工具也有一些簡單的方法來解決其他部署概念。✨