Skip to content

服务器工作者 - 使用工作进程的Uvicorn

让我们回顾一下之前提到的部署概念:

  • 安全性 - HTTPS
  • 开机自启动
  • 重启
  • 复制(运行的进程数量)
  • 内存
  • 启动前的步骤

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

在部署应用程序时,你可能希望有一些**进程复制**,以利用**多核**并能够处理更多请求。

正如你在上一章关于部署概念中看到的,你可以使用多种策略。

在这里,我将向你展示如何使用带有**工作进程**的**Uvicorn**,使用 fastapi 命令或直接使用 uvicorn 命令。

/// 信息

如果你使用容器,例如使用 Docker 或 Kubernetes,我将在下一章中告诉你更多关于这方面的内容:FastAPI 在容器中 - Docker

特别是,当你在**Kubernetes**上运行时,你可能**不**希望使用工作进程,而是为每个容器运行**一个单独的 Uvicorn 进程**,但我将在该章节中告诉你更多。

///

多工作进程

你可以使用 --workers 命令行选项启动多个工作进程:

//// 标签 | fastapi

如果你使用 fastapi 命令:

$ <pre> <font color="#4E9A06">fastapi</font> run --workers 4 <u style="text-decoration-style:single">main.py</u>
<font color="#3465A4">信息    </font> 使用路径 <font color="#3465A4">main.py</font>
<font color="#3465A4">信息    </font> 解析绝对路径 <font color="#75507B">/home/user/code/awesomeapp/</font><font color="#AD7FA8">main.py</font>
<font color="#3465A4">信息    </font> 从包含 <font color="#3465A4">__init__.py</font> 文件的目录中搜索包文件结构
<font color="#3465A4">信息    </font> 从 <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font> 导入

 ╭─ <font color="#8AE234"><b>Python 模块文件</b></font> ─╮
 │                      │
 │  🐍 main.py          │
 │                      │
 ╰──────────────────────╯

<font color="#3465A4">信息    </font> 导入模块 <font color="#4E9A06">main</font>
<font color="#3465A4">信息    </font> 找到可导入的 FastAPI 应用

 ╭─ <font color="#8AE234"><b>可导入的 FastAPI 应用</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">信息    </font> 使用导入字符串 <font color="#8AE234"><b>main:app</b></font>

 <font color="#4E9A06">╭─────────── FastAPI CLI - 生产模式 ───────────╮</font>
 <font color="#4E9A06">│                                                     │</font>
 <font color="#4E9A06">│  服务地址: http://0.0.0.0:8000                    │</font>
 <font color="#4E9A06">│                                                     │</font>
 <font color="#4E9A06">│  API 文档: http://0.0.0.0:8000/docs                 │</font>
 <font color="#4E9A06">│                                                     │</font>
 <font color="#4E9A06">│  正在生产模式下运行,开发请使用:                 │</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">信息</font>:     Uvicorn 运行在 <b>http://0.0.0.0:8000</b> (按 CTRL+C 退出)
<font color="#4E9A06">信息</font>:     启动父进程 [<font color="#34E2E2"><b>27365</b></font>]
<font color="#4E9A06">信息</font>:     启动服务器进程 [<font color="#06989A">27368</font>]
<font color="#4E9A06">信息</font>:     等待应用启动。
<font color="#4E9A06">信息</font>:     应用启动完成。
<font color="#4E9A06">信息</font>:     启动服务器进程 [<font color="#06989A">27369</font>]
<font color="#4E9A06">信息</font>:     等待应用启动。
<font color="#4E9A06">信息</font>:     应用启动完成。
<font color="#4E9A06">信息</font>:     启动服务器进程 [<font color="#06989A">27370</font>]
<font color="#4E9A06">信息</font>:     等待应用启动。
<font color="#4E9A06">信息</font>:     应用启动完成。
<font color="#4E9A06">信息</font>:     启动服务器进程 [<font color="#06989A">27367</font>]
<font color="#4E9A06">信息</font>:     等待应用启动。
<font color="#4E9A06">信息</font>:     应用启动完成。
</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 个工作进程。

你还可以看到它显示了每个进程的 PID27365 是父进程(这是 进程管理器),每个工作进程的 PID 分别是:27368273692737027367

部署概念

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

从上面的部署概念列表来看,使用工作进程主要有助于 复制 部分,以及在 重启 方面也有一些帮助,但你仍然需要自己处理其他部分:

  • 安全性 - HTTPS
  • 开机自启动
  • 重启
  • 复制(运行的进程数量)
  • 内存
  • 启动前的步骤

容器与 Docker

在下一章关于 FastAPI 在容器中 - Docker 中,我将介绍一些你可以用来处理其他 部署概念 的策略。

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

总结

你可以使用 --workers CLI 选项与 fastapiuvicorn 命令一起使用多个工作进程,以利用 多核 CPU,运行 多个进程并行

如果你在设置 自己的部署系统 时,可以利用这些工具和想法,同时自己处理其他部署概念。

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