[ PROMPT_NODE_24746 ]
生命周期 (Lifespans)
[ SKILL_DOCUMENTATION ]
# 生命周期 (Lifespans)
> 通过可组合的生命周期进行服务器级别的设置与清理
生命周期允许你在服务器启动时运行一次代码,并在停止时进行清理。与按会话处理程序不同,无论有多少客户端连接,生命周期都只会运行一次。
## 基本用法
使用 `@lifespan` 装饰器定义一个生命周期:
python
from fastmcp import FastMCP
from fastmcp.server.lifespan import lifespan
@lifespan
async def app_lifespan(server):
# 设置:服务器启动时运行一次
print("Starting up...")
try:
yield {"started_at": "2024-01-01"}
finally:
# 清理:服务器停止时运行
print("Shutting down...")
mcp = FastMCP("MyServer", lifespan=app_lifespan)
你 yield 的字典将成为**生命周期上下文**,可在工具中访问。
> **注意:** 务必使用 `try/finally` 进行清理代码,以确保即使服务器被取消,清理逻辑也能运行。
## 访问生命周期上下文
通过 `ctx.lifespan_context` 在工具中访问生命周期上下文:
python
from fastmcp import FastMCP, Context
from fastmcp.server.lifespan import lifespan
@lifespan
async def app_lifespan(server):
# 初始化共享状态
data = {"users": ["alice", "bob"]}
yield {"data": data}
mcp = FastMCP("MyServer", lifespan=app_lifespan)
@mcp.tool
def list_users(ctx: Context) -> list[str]:
data = ctx.lifespan_context["data"]
return data["users"]
## 组合生命周期
使用 `|` 运算符组合多个生命周期:
python
from fastmcp import FastMCP
from fastmcp.server.lifespan import lifespan
@lifespan
async def config_lifespan(server):
config = {"debug": True, "version": "1.0"}
yield {"config": config}
@lifespan
async def data_lifespan(server):
data = {"items": []}
yield {"data": data}
# 使用 | 进行组合
mcp = FastMCP("MyServer", lifespan=config_lifespan | data_lifespan)
组合后的生命周期:
* 按顺序进入(从左到右)
* 按相反顺序退出(从右到左)
* 合并它们的上下文字典(冲突时,后面的值会覆盖前面的值)
## 向后兼容性
现有的 `@asynccontextmanager` 生命周期在直接传递给 FastMCP 时仍然有效:
python
from contextlib import asynccontextmanager
from fastmcp import FastMCP
@asynccontextmanager
async def legacy_lifespan(server):
yield {"key": "value"}
mcp = FastMCP("MyServer", lifespan=legacy_lifespan)
要将 `@asynccontextmanager` 函数与 `@lifespan` 函数组合,请使用 `ContextManagerLifespan` 进行包装:
python
from