0

0

如何在FastAPI服务器启动后执行一次性初始化函数

聖光之護

聖光之護

发布时间:2025-10-29 13:44:26

|

681人浏览过

|

来源于php中文网

原创

如何在FastAPI服务器启动后执行一次性初始化函数

本文详细介绍了如何在fastapi应用启动后,利用其内置的`lifespan`事件管理机制执行一次性初始化函数。通过`asynccontextmanager`装饰器定义生命周期函数,并将其传递给`fastapi`实例,可以确保特定任务(如数据加载、数据库连接初始化)在服务器开始处理请求前完成,从而实现对应用启动流程的精确控制。

在开发Web应用程序时,我们经常需要在服务器启动后、开始处理用户请求之前执行一些初始化任务。这些任务可能包括加载配置、初始化数据库连接、预加载数据到内存或启动后台服务等。对于FastAPI应用,直接在if __name__ == "__main__":块中调用函数可能无法满足“服务器启动后”的要求,因为这些函数会在Uvicorn启动之前执行,或者在Uvicorn启动后无法被调用。FastAPI提供了一个优雅的解决方案:lifespan事件管理。

使用 lifespan 管理应用生命周期事件

FastAPI的lifespan机制允许开发者定义在应用启动和关闭时需要执行的异步任务。它通过Python的contextlib.asynccontextmanager装饰器实现,提供了一个清晰的上下文管理模式。

lifespan 的工作原理

lifespan 函数是一个异步上下文管理器,其核心在于yield关键字。在yield之前执行的代码会在应用启动时运行,而yield之后(或yield块退出时)执行的代码则会在应用关闭时运行。这使得我们能够精确地控制初始化和清理操作的执行时机。

实现启动时一次性函数

假设我们有一个名为 create_data 的函数,需要在FastAPI服务器启动后立即执行,以初始化全局数据。

Grokipedia
Grokipedia

xAI推出的AI在线百科全书

下载
import time
import uvicorn
from fastapi import FastAPI
from contextlib import asynccontextmanager

# 全局数据,将在启动时初始化
DATA = {"value": ""}

def create_data():
    """模拟一个耗时的数据初始化过程"""
    print("开始执行数据初始化...")
    time.sleep(2)  # 模拟耗时操作
    DATA["value"] = "Hello World from FastAPI!"
    print("数据初始化完成。")

# 定义应用生命周期管理器
@asynccontextmanager
async def lifespan(app: FastAPI):
    """
    FastAPI应用的生命周期管理函数。
    在yield之前执行启动任务,在yield之后(或退出时)执行关闭任务。
    """
    create_data()  # 在应用启动时调用一次性初始化函数
    print("FastAPI应用即将启动并接受请求...")
    yield  # 应用在此处开始接受请求
    # yield之后的代码将在应用关闭时执行
    print("FastAPI应用正在关闭...")
    # 例如,可以在这里清理资源
    DATA["value"] = "" # 清理数据
    print("资源已清理。")

# 创建FastAPI应用实例,并注册lifespan事件
app = FastAPI(lifespan=lifespan)

@app.get("/")
def get_root():
    """
    根路径接口,返回初始化后的数据。
    """
    return DATA

if __name__ == "__main__":
    print("启动Uvicorn服务器...")
    uvicorn.run(app, host="0.0.0.0", port=8000)
    print("Uvicorn服务器已停止。")

代码解析

  1. DATA 变量:一个简单的字典,用于存储需要被 create_data 函数初始化的数据。
  2. create_data() 函数:这是一个同步函数,模拟了数据加载或任何其他初始化任务。它会暂停2秒,然后更新 DATA 字典。
  3. @asynccontextmanager 装饰器:这是定义 lifespan 函数的关键。它将一个异步生成器函数转换为一个异步上下文管理器。
  4. async def lifespan(app: FastAPI)::这是我们的生命周期函数。它接受一个 FastAPI 应用实例作为参数(尽管在这个例子中没有直接使用,但在更复杂的场景中可能需要)。
  5. create_data() 调用:在 yield 语句之前,我们调用了 create_data() 函数。这意味着在FastAPI服务器开始监听传入请求之前,create_data() 会被完整执行。
  6. yield 关键字:这是 lifespan 函数的核心。当执行流到达 yield 时,FastAPI应用会正式启动并开始处理HTTP请求。
  7. yield 之后的代码:在应用关闭时(例如,当Uvicorn进程被终止时),执行流会从 yield 之后继续,从而允许我们执行清理任务。
  8. app = FastAPI(lifespan=lifespan):在创建 FastAPI 应用实例时,通过 lifespan 参数将我们定义的 lifespan 函数注册到应用中。

运行示例

当你运行上述代码时,你会观察到以下输出顺序:

启动Uvicorn服务器...
开始执行数据初始化...
数据初始化完成。
FastAPI应用即将启动并接受请求...
INFO:     Started reloader process [xxxxx] using WatchFiles
INFO:     Started server process [xxxxx]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
# 此时服务器正在运行,你可以通过浏览器或curl访问 http://0.0.0.0:8000
# 访问后会返回 {"value": "Hello World from FastAPI!"}
# 当你按下 CTRL+C 停止服务器时:
INFO:     Shutting down
INFO:     Waiting for application shutdown.
FastAPI应用正在关闭...
资源已清理。
INFO:     Application shutdown complete.
INFO:     Finished server process [xxxxx]
INFO:     Stopping reloader process [xxxxx]
Uvicorn服务器已停止。

这清楚地表明 create_data() 在服务器开始接受请求之前完成执行,并且关闭逻辑在服务器停止后被触发。

注意事项与最佳实践

  1. 异步操作:如果你的初始化任务本身是异步的(例如,等待数据库连接、调用外部API),那么 create_data 函数也应该被定义为 async def,并在 lifespan 中使用 await create_data() 调用。
  2. 错误处理:在 lifespan 函数内部的启动代码中加入适当的错误处理机制。如果启动任务失败,应抛出异常,阻止应用正常启动。
  3. 资源清理:充分利用 yield 之后的代码块进行资源清理,如关闭数据库连接池、文件句柄、释放锁等,确保应用优雅关闭。
  4. 超时设置:如果启动任务耗时过长,Uvicorn可能会因为启动超时而终止。对于特别耗时的任务,考虑将其拆分为后台任务或在应用外部预先完成。
  5. 全局状态管理:lifespan 是初始化全局状态的理想场所,但请注意管理共享状态的并发访问问题,尤其是在生产环境中。

总结

FastAPI的 lifespan 事件管理机制提供了一种强大且优雅的方式来处理应用的启动和关闭任务。通过利用 asynccontextmanager 和 yield 关键字,开发者可以精确地控制初始化函数的执行时机,确保应用在处理请求前处于正确的状态,并在关闭时进行必要的资源清理,从而构建出更加健壮和专业的FastAPI应用。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

27

2025.12.22

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

778

2023.08.22

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

359

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2082

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

349

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

256

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

326

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

412

2023.10.16

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

0

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号