用途
本技能用于掌握 FastAPI 中的异步模式,构建高性能、高并发且资源占用合理的 API。它围绕 FastAPI 的事件循环模型,说明何时使用 async 路由、何时使用同步路由,并给出数据库、后台任务、实时通信与流式传输等场景的代码范例。
主要能力
异步与同步路由处理器
对比 async 与 sync 端点在 FastAPI 中的差异:同步端点使用 time.sleep 会阻塞整个服务器事件循环;异步端点使用 await asyncio.sleep 时其他请求仍可被处理。文档指出 CPU 密集型工作应使用同步端点,I/O 密集型工作应使用异步端点(例如用 httpx.AsyncClient 发起外部请求)。
异步数据库操作
给出多种 ORM 与驱动的异步用法,包括:
- SQLAlchemy 异步引擎与 AsyncSession,通过 Depends 注入会话,包含 commit、rollback 与异常处理。
- 直接使用 asyncpg 连接池(min_size、max_size),以 fetchrow 查询。
- 使用 Motor 的 AsyncIOMotorClient 操作 MongoDB,包含 find_one 与 insert_one。
- 使用 Tortoise ORM 的 register_tortoise 注册与模型定义,通过 get_or_none 查询。
后台任务
使用 BackgroundTasks 实现 fire-and-forget 任务,不阻塞响应。示例包括发送邮件、记录活动日志、更新分析数据,以及上传文件后延迟清理临时文件。
WebSocket 处理
涵盖接受连接、接收与回显文本、带基于 token 的认证(未授权时以 1008 关闭)、通过 ConnectionManager 管理活跃连接并广播消息,以及收发 JSON 消息(ping/pong、message 等类型)。
Server-Sent Events(SSE)
使用 sse_starlette 的 EventSourceResponse 实现服务器到客户端的单向流式推送,示例包含按序推送消息、轮询实时更新,以及带心跳与 CancelledError 处理的连接。
流式响应
使用 StreamingResponse 分块流式传输大文件、分批生成并导出 CSV、逐步生成 HTML 报告内容,并设置 media_type 与 Content-Disposition 头。
并发请求处理
使用 asyncio.gather 并行调用多个外部 API 或并行执行多个数据库查询(仪表盘聚合场景);使用 asyncio.wait 配合 FIRST_COMPLETED 实现竞态(最快响应获胜)并取消未完成任务。
异步上下文管理器
使用 contextlib.asynccontextmanager 定义 lifespan 生命周期,在启动时创建数据库连接池与 Redis 客户端并存入 app.state,关闭时释放资源;并给出自定义异步上下文管理器管理数据库连接获取与释放的示例。
连接池
介绍数据库与 HTTP 客户端的连接池管理(资料在连接池章节处截断,后续内容暂未提供)。
使用方式
资料以代码示例形式呈现,未提供安装命令或具体集成步骤。示例中出现的依赖包括 fastapi、sqlalchemy(ext.asyncio)、asyncpg、motor、tortoise、sse_starlette、httpx 等,均以 import 形式给出。
适用场景
适合构建需要处理并发请求、异步数据库访问、实时双向通信(WebSocket)、服务端推送(SSE)、大文件或大批量数据流式输出,以及多数据源并行聚合的高性能 API 服务。
限制
资料未说明版本要求、性能基准、价格、支持的平台或部署环境,这些信息暂未提供。连接池章节内容不完整。