跳到内容

服务器工作进程 - Uvicorn与工作进程

让我们回顾一下之前部署概念

  • 安全性 - HTTPS
  • 启动时运行
  • 重启
  • 复制(运行的进程数)
  • 内存
  • 启动前的准备步骤

到目前为止,通过文档中的所有教程,您可能一直在运行一个服务器程序,例如使用`fastapi`命令来运行 Uvicorn,它运行的是单个进程

部署应用程序时,您可能希望**复制进程**以利用**多核**并处理更多请求。

正如您在上一章部署概念中所看到的,有多种策略可供使用。

在这里,我将向您展示如何使用 `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` 是父进程(这是**进程管理器**),每个工作进程也有一个 PID:`27368`、`27369`、`27370` 和 `27367`。

部署概念

在这里,您看到了如何使用多个**工作进程**来**并行化**应用程序的执行,利用 CPU 的**多核**优势,并能够处理**更多请求**。

从上述部署概念列表中,使用工作进程主要有助于**复制**部分,并在**重启**方面有所帮助,但您仍需处理其他方面

  • 安全性 - HTTPS
  • 启动时运行
  • 重启
  • 复制(运行的进程数)
  • 内存
  • 启动前的准备步骤

容器和 Docker

在关于容器中的 FastAPI - Docker的下一章中,我将解释一些可用于处理其他**部署概念**的策略。

我将向您展示如何**从头构建自己的镜像**以运行单个 Uvicorn 进程。这是一个简单的过程,当使用像 **Kubernetes** 这样的分布式容器管理系统时,这可能正是您想要做的。

总结

您可以使用 `--workers` CLI 选项配合 `fastapi` 或 `uvicorn` 命令来使用多个工作进程,以利用**多核 CPU**,并**并行运行多个进程**。

如果您正在搭建**自己的部署系统**并自行处理其他部署概念,您可以使用这些工具和思想。

查看下一章,了解带有容器(例如 Docker 和 Kubernetes)的 **FastAPI**。您会看到这些工具也有简单的方法来解决其他的**部署概念**。✨