如何触发FastAPI/Uvicorn的干净关闭 [英] How to trigger clean shutdown of FastAPI/Uvicorn

查看:0
本文介绍了如何触发FastAPI/Uvicorn的干净关闭的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用uvicorn和python子进程.POpen运行许多FastAPI实例。我有一个用PySimpleGUI制作的小图形用户界面,我想用它来随意关闭和重新启动服务器。

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

仍然是一个主要问题,在进程上调用psutil.terminate()并不调用@app.on_event("shutdown")下的FastAPI函数。过去,我们在各个终端窗口中运行所有服务器,发现那些终端窗口上的ctrl-c键将调用Shutdown事件,但我没有找到其他方法来这样做。在我的界面上按Ctrl-c显然会关闭界面和所有服务器,并且在命中所有服务器的关机事件时有点不可靠。我的另一个想法是使用psutil.send_signal(signal.CTRL_C_EVENT),但这与在终端中调用ctrl-c具有相同的效果。

所以我不知所措。我看到许多帖子说这是uvicorn的一个普遍缺点,但还没有看到任何直接证实我自己的经验或提供解决方案的东西。我还知道FastAPI中的关机事件和启动事件都是从Starlette传入的,在这两个包中都没有很好的记录。我看到了使用guvicorn的建议,但我简单地看了一下,证实它与Windows不兼容。有什么建议吗?

推荐答案

TL;DR:

  • API应该是长时间运行的进程
  • 整个行业都围绕着虚拟化来自动管理何时启动或停止服务的流程编排
  • 还有无服务器基础架构,您可以挂起您的任何进程,而不必在此领域花费任何努力,因为这不是一件事
  • 如果您仍然想与其他人对抗并自己管理,您可以这样做this answered question
    ##### SOLUTION #####
    pid = proc.pid
    parent = psutil.Process(pid)
    for child in parent.children(recursive=True):
        child.kill()
    ##### SOLUTION END ####

稍微解释一下:

从REST API作为架构模式的概念来看,它意味着总是等待用户通过Web发出的请求。从未有过优雅地管理和开发一种产品来优雅地处理某些原本应该永远运行的东西的关闭,而我们建立了工作流程来保持它作为一个行业全天候运行。

如果你想要利用在同一设备上同时启动或停止一对多API的能力,强烈建议你至少使用容器和Kubernetes之类的东西,并只使用针对Kubernetes的CLI的脚本命令来实现这一目的。作为额外工作的交换,您将获得与其他人和基础OS层的进程隔离(这仍然比您自己构建所有这些工具要少。 我个人最喜欢的不是这样做,而是直接使用lambdas,因为在很多方面都更容易、更好。不要相信我,而是来自行业领先的公司之一Cloudflare和their statements on the subject

与传统的基于云或以服务器为中心的基础设施相比,无服务器计算具有许多优势。对于许多开发人员来说,无服务器体系结构提供了更高的可伸缩性、更高的灵活性和更快的发布时间,所有这些都以更低的成本实现。

这篇关于如何触发FastAPI/Uvicorn的干净关闭的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆