iris 框架本身不内置热重载功能,需借助 air 等外部工具实现开发阶段的保存即重启;其设计为长生命周期服务进程,与 streamlit 的脚本重执行模式本质不同。

Iris 框架本身不内置热重载(hot reload)功能,它是一个生产就绪的 HTTP 框架,设计目标是轻量、高性能和明确的生命周期控制。想在开发阶段实现保存即重启,必须借助外部工具或手动集成。
为什么 Iris 不像 Streamlit 那样支持热重载
Streamlit 的“热重载”本质是每次用户交互都触发整个脚本重执行,而 Iris 是典型的长生命周期服务进程:启动后监听端口、注册路由、等待请求 —— 它没有“重执行上下文”的概念。你改了 main.go,进程不会自己感知并 reload,必须显式终止再启动。
用 air 实现 Go 项目的热重载(推荐)
air 是目前最主流、配置最轻量的 Go 热重载工具,专为开发阶段设计,与 Iris 兼容性极好。
- 安装:
go install github.com/cosmtrek/air@latest - 在项目根目录运行:
air(会自动查找.air.toml或使用默认配置) - 默认监听
./...下所有.go文件变化,检测到修改后杀掉旧进程、重新go run main.go - 如需排除生成文件或测试代码,可创建
.air.toml:
[build] cmd = "go build -o ./app main.go" bin = "./app" include_ext = ["go", "tpl", "html"] exclude_dir = ["vendor", "tests", "tmp"]
注意:Iris 如果用了模板(iris.HTML),记得把 .html 或 .tpl 加入 include_ext,否则改了模板不会触发重启。
常见踩坑点
以下问题在 Iris + air 组合中高频出现:
-
air启动失败报fork/exec ./app: no such file or directory:说明bin路径不对,或cmd没成功生成二进制;建议先手动跑通go run main.go再用air - 改了
models或controllers目录下的文件但没 reload:检查air是否监听了子目录(默认是的),也可能是文件系统 inotify 限制太低,Linux 下可临时调高:echo 524288 | sudo tee /proc/sys/fs/inotify/max_user_watches -
Iris启动时绑定端口失败(address already in use):air杀进程有时不干净,残留./app进程;可在.air.toml的[misc]下加clean_on_exit = true - 用
gorm连数据库时,热重载频繁建连断连导致 MySQL 报Too many connections:应在main.go中复用*gorm.DB实例,避免每次 reload 都新建连接池
热重载只是开发便利性手段,Iris 的真正复杂点在于服务启停时的资源清理 —— 比如 WebSocket 连接、定时任务、数据库连接池、日志句柄。这些不会因为 air 重启就自动释放,得靠你写好 iris.RegisterOnInterrupt 和 defer 逻辑。别只盯着“保存就生效”,忘了关干净。











