繁体   English   中英

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

[英]How to trigger clean shutdown of FastAPI/Uvicorn

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

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

仍然存在的主要问题是,在进程上调用psutil.terminate()不会调用@app.on_event("shutdown")下的 FastAPI function。 过去,我们在单个终端 windows 中运行我们所有的服务器,发现在这些终端 windows 上的 ctrl-c 会调用关闭事件,但我没有找到其他方法。 我界面上的 ctrl-c 显然会关闭界面和所有服务器,并且在触发所有服务器的关闭事件时有些不可靠。 我的另一个想法是使用psutil.send_signal(signal.CTRL_C_EVENT) ,但这与在终端中调用 ctrl-c 具有相同的效果。

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

长话短说:

  • API 应该是长期运行的进程
  • 整个行业都围绕着虚拟化来自动管理何时启动或停止服务的编排
  • 还有“无服务器”基础设施,你可以挂起你的任何流程,而不必在这个领域花费任何精力,因为它不是一个东西
  • 如果你仍然想 go 对抗其他人并自己管理它,你可以按照这个回答的问题来做
    ##### SOLUTION #####
    pid = proc.pid
    parent = psutil.Process(pid)
    for child in parent.children(recursive=True):
        child.kill()
    ##### SOLUTION END ####

一点解释:

从 Rest API 作为一种架构模式的概念来看,它意味着始终等待用户通过 web 发出的请求。优雅地管理和开发产品以优雅地关闭“曾经是”的东西从来都不是一般的意图意味着永远运行”,我们构建流程以使其作为一个行业保持 24/7/365 运行。

如果你想利用同一设备同时启动或停止一对多 APIS 的能力,强烈建议你至少 go 使用容器和 Kube.netes 之类的东西,并且只需针对 Kube.netes 的 CLI 编写脚本命令即可目的。 作为额外努力的交换,您将获得与其他人和基础操作系统层的进程隔离(这仍然比自己构建所有工具要少。我个人最喜欢的是甚至不这样做并直接使用 lambdas在很多方面都更容易、 更好

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM