如何触发 FastAPI/Uvicorn 的干净关闭

2024-04-14

我正在使用 uvicorn 和 python 的 subprocess.Popen 运行多个 FastAPI 实例。我有一个用 PySimpleGUI 制作的小型 GUI,我希望能够随意关闭服务器并重新启动它们。

我遇到的第一个问题是,至少在 Windows 中,启动 uvicorn 服务器似乎创建的不是一个,而是两个新进程,并调用Popen.terminate()仅关闭这些进程之一,这不会释放与服务器关联的端口。我使用 psutil 包修复了这个问题,以检查实例化 Popen 对象后创建了哪些新进程,并使用 psutil 跟踪和终止第二个进程。

还有一个主要问题是调用psutil.terminate()就进程不调用FastAPI函数而言@app.on_event("shutdown")。过去,我们在单独的终端窗口中运行所有服务器,并发现这些终端窗口上的 ctrl-c 将调用关闭事件,但我没有找到其他方法来执行此操作。我界面上的 ctrl-c 显然会关闭界面和所有服务器,并且在命中所有服务器的关闭事件方面有些不可靠。我的另一个想法是使用psutil.send_signal(signal.CTRL_C_EVENT),但这与在终端中调用 ctrl-c 具有相同的效果。

所以我很茫然。我看到很多帖子说这是 uvicorn 的普遍缺点,但没有看到任何直接证实我自己的经验或提供解决方案的内容。我还知道 FastAPI 中的“关闭”和“启动”事件是从 Starlette 移植的,并且在这两个包中都没有很好的记录。我看到过使用 guvicorn 的建议,但我的简短调查证实它与 Windows 不兼容。有什么建议么?


TL;DR:

  • API 是长期运行的进程
  • 整个行业都围绕虚拟化来自动管理何时启动或停止服务的编排
  • 还有“无服务器”基础设施,您可以挂起任何流程,而无需在该领域花费任何精力,因为它本来就不是一件事
  • 如果您仍然想与其他人对抗并自己管理,您可以这样做这个回答了问题 https://stackoverflow.com/questions/68603658/how-to-terminate-a-uvicorn-fastapi-application-cleanly-with-workers-2-when
    ##### SOLUTION #####
    pid = proc.pid
    parent = psutil.Process(pid)
    for child in parent.children(recursive=True):
        child.kill()
    ##### SOLUTION END ####

一点解释:

从 Rest API 作为一种架构模式的概念来看,它意味着始终等待来自网络的用户请求。优雅地管理和开发产品来优雅地处理“本来应该永远运行”的事物的关闭从来都不是普遍的意图,我们构建流程来努力保持其作为一个行业 24/7/365 的运行。

如果您想利用在同一设备上同时启动或停止一对多 API 的能力,强烈建议您至少使用容器和 Kubernetes 之类的东西,并且只需针对 Kubernetes CLI 编写命令脚本即可实现此目的。作为额外努力的交换,您将获得与其他人和基础操作系统层的进程隔离(这仍然比您自己构建所有工具要省力。 我个人最喜欢的就是不这样做,而是直接使用 lambda,因为在很多方面都更容易、更好。不要从我的口中得知,而是从行业领先的公司之一 Cloudflare 和他们关于该主题的陈述 https://www.cloudflare.com/learning/serverless/why-use-serverless/

与传统的基于云或以服务器为中心的基础设施相比,无服务器计算具有许多优势。对于许多开发人员来说,无服务器架构提供了更大的可扩展性、更大的灵活性和更快的发布时间,而且成本更低。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何触发 FastAPI/Uvicorn 的干净关闭 的相关文章

随机推荐

  • 为什么Oracle要在这里添加隐藏列呢?

    我们最近将客户系统迁移到 Oracle 12c 和我们产品的最新版本 此过程包括运行许多迁移脚本 其中主要是添加或更改表 我们注意到 向表中添加一列同时提供默认值会创建一个额外的隐藏列SYS NC00002 您应该能够使用以下代码重现此内容
  • 如何为多种屏幕尺寸编写媒体查询?

    如果我想要 body font size 18 px 1900及以上 body font size 16 px 1024 和 1900 body font size 14 px 768 至 1023 body font size 12 px
  • 是否可以在Mongodb中获取切片的切片?

    我正在查询一个 mongo 集合 该集合有一个字段 该字段是数组的数组 我想找到一条记录 其中包含数组数组中一个深度值的投影 从概念上讲 这是 slice 的 slice 在 Mongo 有没有办法做到这一点 例如 我有一条记录 name
  • C++ 是否支持 ASCII?

    一位同事告诉我 C 不支持 ASCII The 源字符集C 程序的定义是实现定义的 那么我的同事在多大程度上是错误的呢 C 编译器在链接数字时需要识别 ASCII48价值 0 所以是的 它需要能够识别 ASCII 但它总是需要吗 想象一下你
  • Node.JS 中的 HTTP DELETE 动词

    在向 Node js 应用程序发出 DELETE 请求之前 是否需要设置任何配置 我会做GET POST or PUT要求 但是DELETE请求将不起作用 DELETE http localhost 8081 api 1 0 entry y
  • 选择具有特定子元素的元素?

    如果我想在这样的列表上做一个 CSS 选择器 ul li li li a a li li a a li li a a li ul 我想做一个li hover仅影响li包含一个 a tag 有没有办法在CSS中指定它 if li hover
  • Javascript - 检查“dragenter”上的文件类型

    我试图仅允许 jpg 文件 当您拖动 拖动时 如果至少有一个被拖动的文件不是 jpg 那么我想显示错误消息 否则只显示活动的放置区 我无法获得仅检查 jpg 文件的正确语法 即使文件时间是 jpg 我也会不断触发错误消息 无论我做错了什么
  • Keras 自定义损失函数传递 y_true 和 y_pred 以外的参数

    我正在编写一个 keras 自定义损失函数 其中我想将以下内容传递给该函数 y true y pred 这两个无论如何都会自动传递 模型内层的权重和一个常量 像下面这样 def Custom loss y true y pred layer
  • 如何在Windows上部署具有深层node_modules结构的Node.js应用程序?

    我遇到了一个奇怪的问题 显然某些 Node js 模块有这样的问题deep文件夹层次结构Windows 复制命令 或 PowerShell 的Copy Item当路径长度超过 250 个字符时 会出现臭名昭著的 路径太长 错误 例如 这是单
  • Scaffold-DbContext 为没有主键的表创建模型

    我正在尝试为 ASP NET core MVC 应用程序中的特定表创建 DBcontext 和相应的模型 该表没有任何主键 我正在按照 Scaffold DbContext 命令运行 Scaffold DbContext Server XX
  • setup.py 与 conda 安装的依赖项(不是 pip)

    我正在开发一个现有的 Python 3 代码库 它提供了setup py因此代码作为 Python 库安装 我正在尝试安装这个内部库及其自己的依赖项 通常的数据科学库 例如pandas pyodbc sqlalchemy etc 我希望有这
  • 将大核心文件转换为“minicore”文件

    如何将核心文件减少到仅线程堆栈 我希望能够运行 gdbthread apply all bt在迷你核心上 仅此而已 我正在处理大型 gt 4GB 多线程 Linux ELF 核心文件 这些文件太大而无法返回进行分析 我见过谷歌断点器 htt
  • MVC 5 HttpErrors + 控制器/操作

    如何更改控制器 操作的错误路径与http错误 我有这个代码
  • 如何使用 python 的 elasticsearch DSL 访问响应对象

    我有以下代码 s Search using Elasticsearch http user passwd ipaddress index myindex q Q multi match query some query fields all
  • 使用 ywunbiased 时,statsmodels.tsa.stattools 中的 PACF 函数给出的数字大于 1?

    我有一个长度为 177 的数据帧 我想计算并绘制部分自相关函数 PACF 我已导入数据等 我这样做 from statsmodels tsa stattools import pacf ys pacf data key array diff
  • 以编程方式授予权限而不使用策略文件

    如何以编程方式授予AllPermissions to an RMI不使用策略文件的应用程序 UPDATE 经过一番研究 我编写了这个自定义策略类并通过安装它Policy setPolicy new MyPolicy 现在我收到以下错误 无效
  • 通过纯 JavaScript 使用 AWS cognito

    希望有人能够阐明如何通过纯 JavaScript 使用 Cognito 没有 npm 没有 webpack 只有纯 JavaScript 我发现一篇文章提供了一个很好的示例 其中包括所需的 AWS JavaScript 库 我从这个例子开始
  • 如何扩展 AuthorizeAttribute 并检查用户的角色

    我正忙着为我的操作方法编写自己的自定义属性 称为 AuthorizeAttribute 我仍然忙着编写代码 这是我的部分代码 AttributeUsage AttributeTargets Method AllowMultiple fals
  • ServiceStack 与 MVC 并行运行

    我设法与 MVC4 并行运行 ServiceStack 但我仍然有一个小问题 希望有人可以帮助我解决这个问题 当通过 VS2012 执行调试会话时 一切都很完美 浏览器打开并且第一页加载良好 但是当刷新页面并尝试访问时http localh
  • 如何触发 FastAPI/Uvicorn 的干净关闭

    我正在使用 uvicorn 和 python 的 subprocess Popen 运行多个 FastAPI 实例 我有一个用 PySimpleGUI 制作的小型 GUI 我希望能够随意关闭服务器并重新启动它们 我遇到的第一个问题是 至少在