第3章 异步模型与依赖注入


第 3 章 · 异步模型与依赖注入

章节摘要:本章处理两个"让 FastAPI 成为 FastAPI"的机制——异步执行模型与依赖注入系统。前者回答"一个进程怎么同时服务上千个等待中的请求",我们把 def 与 async def 的分派规则、事件循环的让出机制、同步依赖的线程池兜底逐一拆开,并给出"整条链路异步才有效"的判断方法;后者把认证、数据库会话、公共参数这些横切关注点从业务函数体里抽出来,变成签名里可声明、可复用、可覆盖的依赖,与 Flask 的全局对象和手写单例做正面对比。

学习目标

阅读完本章,你应当能够:

  1. 准确说出 def 路由与 async def 路由分别被分派到哪里执行;
  2. 解释"async 里调用同步阻塞库"为什么比纯同步更糟;
  3. 用 AnyIO 线程池的默认行为推断同步路由的并发上限;
  4. 写出带 yield 的依赖,精确控制清理时机与异常传播;
  5. 用依赖嵌套组织横切关注点,并在测试里覆盖依赖实现。

核心概念速览

一句金句:异步不是更快的关键字,而是等待时让出座位的纪律;依赖注入不是炫技的语法,而是把"准备与清理"从业务代码里搬走的滑轨。

子章节导航

3.1 同步与异步路由:执行模型与性能对比

def 与 async def 一字之差,执行路径完全不同。本节用可运行的对照实验展示事件循环的让出机制,解释线程池兜底的容量边界(默认 40 线程的由来与调优),并给出迁移存量同步代码的"先同步路由、再逐段异步化"路线。

3.2 依赖注入:对比全局变量与手写单例

从 Flask 的 g 对象与手工单例的痛点讲起,展示 Depends 的声明式依赖:参数级、路由级、全局级三层挂载,带 yield 的资源生命周期管理,依赖嵌套与缓存,以及测试中 dependency_overrides 的替换能力。

子章节之间的逻辑关系

两节是"运行时"与"组织方式"的关系:

3.1 执行模型(请求在什么上下文里跑) │ ▼ 3.2 依赖注入(上下文里的资源怎么来的) ​

3.1 决定代码跑在事件循环还是线程池,3.2 决定这段代码能拿到什么资源、资源何时创建何时释放。数据库会话是两者交汇的典型例子:异步路由配异步会话工厂,依赖注入负责每次请求一个会话——第 6 章的数据库集成正是按这个组合展开的,本章是它的前置必修。

阅读本章的一个提醒

异步是全册概念密度最高的部分,也最容易形成"背结论"式的错误理解。建议对 3.1 的每个结论都亲手跑一次对照实验:把 time.sleep 放进 async def、把 asyncio.sleep 放进 def、并发打满线程池观察排队——五分钟的实验比十遍阅读更能建立正确的直觉。实验代码都在正文里,环境是第 1 章搭好的那套,无需新增依赖。

对 3.2 的依赖注入,实验方式换成"重构练习":找一个自己写过的接口,把参数校验、认证检查、资源获取三段代码分别尝试改写成依赖,然后问自己两个问题——改写后业务函数还剩几行?测试这段逻辑需要构造多少上下文?两个数字的变化就是依赖注入收益的直接读数。没有亲手做过这次重构的人,往往要么把依赖注入当成万能药(什么都包一层),要么当成过度设计(完全不用)——两极认知都源于没有体感。

本章另一个值得建立的思维习惯:看到任何 FastAPI 代码时,先在脑内标记每个函数的执行环境(事件循环还是线程池),再看它调用的资源是同步还是异步。这个"双色标记"的阅读方式一旦养成,第 7 章的性能排查会觉得理所当然——所谓瓶颈,不过是标错色的调用。

前置知识与后续延伸

  • 前置:第 2 章的参数声明已熟练;对协程有初步概念(await 一个耗时操作时函数可以让出)即可,不需要先读完 asyncio 文档。
  • 为后续铺垫:执行模型知识直接用于第 5 章后台任务与第 7 章部署的 worker 数量决策;依赖注入是第 5 章安全认证、第 6 章数据库会话的载体,全册后半部分的代码示例默认你已掌握本章内容。

两节共用的一个判例库

本章末尾留一组判例,供日后犹豫时查阅:把同步驱动放进 async 路由——判阻塞事件循环,改 def 路由或换异步驱动;认证检查写在每个视图开头——判重复横切,改为认证依赖;数据库会话在路由里手动开关——判生命周期泄漏风险,改 yield 依赖;分页参数复制到十个接口——判参数样板,改类依赖加 Annotated 别名;测试里构造完整请求只为绕过认证——判测试设计缺陷,改依赖覆盖。五个判例覆盖了两节机制的全部典型误用,也预告了后续各章如何在这些位置安放标准解法。

本章小结

执行模型与依赖注入,一个管"代码在哪跑",一个管"资源从哪来"——它们是 FastAPI 区别于上一代框架的两块基石,也是后续所有章节的地基:安全是依赖链的应用,数据库是 yield 依赖的应用,测试是依赖覆盖的应用,部署是执行模型的应用。把本章吃透,全册后半部分的每个新机制你都能在三十秒内定位到它站在哪块基石上。这种"机制拼图"式的理解,正是对比驱动学习想要抵达的终点——不是记住更多 API,而是获得预测新机制行为的能力。

作者与出处
原作者:灏天文库
来源:平台策划编纂
整理人: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U