FastAPI 有没有一种干净地停止 uvicorn 的方法

FastAPI 有没有一种干净地停止 uvicorn 的方法

在本文中,我们将介绍如何干净地停止 FastAPI 中正在运行的 uvicorn 服务器。

阅读更多:FastAPI 教程

什么是 FastAPI 和 uvicorn?

FastAPI 是一个用于构建 Web 应用程序的现代、高性能的 Python 框架。它基于 Python 类型注释和异步编程,旨在提供快速且易于使用的开发体验。

而 uvicorn 是 FastAPI 默认的 ASGI 服务器,它以高性能工作,支持异步请求处理。当我们启动 FastAPI 应用程序时,uvicorn 将会成为我们的应用程序和客户端之间的中间件,帮助我们处理请求和响应。

停止 uvicorn 的常规方法

通常情况下,我们可以通过在命令行中按 Ctrl + C 来停止运行中的 uvicorn 服务器。这是一种有效的方法,但它可能会导致一些缺陷,比如不够优雅、不支持在代码中动态控制等。

然而,FastAPI 提供了更加规范和灵活的方法来停止 uvicorn 服务器。

使用 FastAPI 提供的方法关闭 uvicorn

FastAPI 提供了一个名为 @app.on_event("shutdown") 的装饰器,该装饰器可以用于在应用程序关闭之前执行一些清理操作。

我们可以在 FastAPI 项目的主文件中定义一个异步函数,并在这个函数中关闭 uvicorn 服务器,实现优雅地停止应用程序。

这是一个示例代码:

from fastapi import FastAPI

app = FastAPI()

@app.on_event("shutdown")
async def shutdown_event():
    # 清理操作
    await close_my_db_connection()
    await stop_my_server()

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)
Python

在上面的代码中,我们定义了一个名为 shutdown_event 的异步函数,并使用 @app.on_event("shutdown") 装饰器将它注册为应用程序关闭事件。

shutdown_event 函数中,我们可以执行一些清理操作,例如关闭数据库连接、停止其他外部服务等。在示例中,我们使用了两个名为 close_my_db_connectionstop_my_server 的异步函数来模拟这些操作。

当我们使用命令 uvicorn main:app 启动应用程序时,uvicorn 将监听 shutdown_event 事件,一旦收到应用程序关闭的信号,它将会自动执行 shutdown_event 函数中的清理操作。

其他关闭 uvicorn 的方法

除了使用 @app.on_event("shutdown") 装饰器之外,FastAPI 还提供了其他几种方式来优雅地停止 uvicorn 服务器。

  1. 使用系统信号(Signal):我们可以使用 Python 的 signal 模块来捕获系统信号,例如 SIGINTSIGTERM 等,在信号处理函数中关闭服务器。
    import signal
    
    def signal_handler(signum, frame):
       # 关闭操作
       stop_my_server()
    
    signal.signal(signal.SIGINT, signal_handler)
    Python
  2. 动态路由控制:FastAPI 还提供了路由控制的能力,我们可以在代码中动态地添加或删除路由。因此,当我们想要关闭服务器时,我们可以通过定义一个特殊的路由,比如 /shutdown,用于触发关闭事件。
    from starlette.responses import PlainTextResponse
    
    @app.get("/shutdown")
    async def shutdown():
       # 关闭操作
       stop_my_server()
       return PlainTextResponse("Server shutting down")
    Python

通过上述两种方式,我们可以在不需要立即停止服务器的情况下,通过信号或请求的方式优雅地关闭 uvicorn 服务器。

总结

使用 FastAPI 可以优雅地停止正在运行的 uvicorn 服务器。通过使用 @app.on_event("shutdown") 装饰器和其他方法,我们可以在应用程序关闭前执行一些清理操作,提供更好的用户体验。此外,FastAPI 还提供了其他几种方式来停止服务器,例如使用系统信号和动态路由控制。这些方法可以更好地满足我们在不同场景下的需求。

在使用 FastAPI 开发 Web 应用程序时,我们可以根据具体需求选择合适的方式来优雅地停止 uvicorn 服务器,提高代码的可维护性和用户体验。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册