FastAPI热重载本质是uvicorn父进程监听文件变化后杀掉并重启子进程,非Python模块热更新;失效主因是watchfiles未捕获变更事件,常见于路径错误、编辑器原子保存、NFS/WSL2文件系统或未包含非.py文件监听。

支持,但必须用 --reload 显式启用,且仅限开发场景;它不是 Python 层的模块热更新,而是靠父进程杀掉子进程再拉起新实例实现的。
为什么加了 --reload 还不重载?
根本原因通常是文件监听层没收到变更事件,不是 FastAPI 或你的代码有问题。
-
watchfiles(Uvicorn 22.0+ 默认)只监听当前工作目录及子目录,如果你在 IDE 里从其他路径启动、或cd到错的目录,它根本看不到你改的文件 - 某些编辑器(如 VS Code 启用“Atomic save”时)会先写临时文件再替换原文件,导致 inotify/kqueue 事件丢失
- Linux 上挂载的网络文件系统(NFS、WSL2 的跨系统路径)、macOS 的 APFS 加密卷,可能不触发原生文件事件
- 没加
--reload-include时,.env、pydantic模型文件、alembic迁移脚本这些非.py文件默认不被监听
--reload 和 --workers 能一起用吗?
不能。Uvicorn 会直接忽略 --workers 并输出警告:"workers" flag is ignored when reloading is enabled。
Uvicorn 0.52.1 是 Python ASGI Web 服务器,提供异步应用服务及 WebSocket 支持,常用于 FastAPI、Starlette 等应用的开发和部署。本下载为官方 PyPI 通用 wheel 包,可使用 pip 安装,并由包管理器处理所需依赖。
- 热重载依赖单个主进程(reloader)持续运行,负责监控 + 管理子 worker;而多进程模式下每个 worker 是独立 fork 出来的,没有统一监工
- 一旦启用
--reload,Uvicorn 就强制退回到单 worker 模式,哪怕你写了--workers 4 - 想测多进程行为,得关掉
--reload,改用--workers 4 --log-level debug配合手动重启
VS Code / PyCharm 里断点失效,是 --reload 的锅吗?
是,但能修——关键在调试器能否 attach 到新 fork 出来的子进程。
- VS Code 必须在
launch.json里设"subProcess": true,否则调试器只 attach 到父进程(reloader),子进程跑起来后断点全失效 - PyCharm 2024.x 版本存在已知兼容问题,
uvicorn >= 0.29.0的watchfiles与它的文件监听冲突,降级到uvicorn==0.20.0是最快解法 - 别用
"program": "main.py"启动,必须用"module": "uvicorn",否则压根不走 ASGI 生命周期,中间件、依赖注入、async 上下文全崩
真正容易被忽略的是:每次重载,整个 worker 进程从头初始化——数据库连接池、Redis 客户端、全局缓存字典,全都重建。这不是 bug,是设计使然;如果你依赖进程内状态,就得自己处理 reload 前后的清理与重建逻辑。










