378 字
2 分钟
生命周期事件

生命周期事件#

可以在应用启动前执行一些逻辑代码,这意味着应用开始接受请求之前.这些代码只会执行一次,同样也可以在应用关闭的时候执行一些操作逻辑,同样也只会执行一次.这对整个应用中使用资源非常有用,这些资源在请求中共享.在之后进行释放,比如数据库连接池或者加载一个共享的机器学习模型.

用例#

比如我有几个机器学习模型,希望使用它们来处理请求,这个模型是共享的,而非每个用户都有一个,假设加载模型需要的时间很长,需要从 disk 读取大量的数据,因此不希望每个请求都加载一次,我们可以在模块/文件顶部加载,但是这会导致我们只是进行一个最简单的测试也会加载模型,这样测试会变的很慢,这就是我们要解决的问题

生命周期 Lifespan#

对于 fastapi,我们可以使用 lifespan 参数和一个上下文管理器来定义启动和关闭的逻辑

from contextlib import asynccontextmanager

from fastapi import FastAPI

def fake_answer_to_everything_ml_model(x: float):
    return x * 42

ml_models = {}

@asynccontextmanager
async def lifespan(app: FastAPI):
    # Load the ML model
    ml_models["answer_to_everything"] = fake_answer_to_everything_ml_model
    yield # 这里是标记进出上下文的代码
    # Clean up the ML models and release the resources
    ml_models.clear()

app = FastAPI(lifespan=lifespan)

@app.get("/predict")
async def predict(x: float):
    result = ml_models["answer_to_everything"](x)
    return {"result": result}