只刷新任务状态那一块,Streamlit Fragment 不必重跑整张页面

为什么值得关注
让长期AI任务的状态和局部数据持续更新,同时减少不相关页面代码的重复执行。
适合谁:用Streamlit制作AI数据工具、需要局部交互与状态面板的开发者
这次有哪些亮点
- st.fragment将局部代码变为独立重运行区域
- run_every可动态设为间隔或None,Session State共享更新
使用前需要知道
Fragment不是任务队列,也不自动持久化后台工作;副作用仍可能重复,缓存与fragment不能装饰同一函数。框架Apache-2.0,实际模型与服务另配。
一个AI工具页面,上半部上传资料、设置模型,下半部显示任务进度。如果每次刷新进度都重新执行整份脚本,昂贵的加载或无关图表也可能跟着重来。Streamlit 的 Fragment,让这块状态显示有机会独立更新。
它改变的是页面执行范围。真正的模型工作如何启动、怎样保存结果,仍需要应用自己的任务逻辑。
一个局部函数,有自己的重运行边界
官方概念说明介绍,常规控件交互会让脚本从上到下重跑。用st.fragment装饰函数后,用户操作其中的控件,可以只重跑该函数,更新对应界面。
这与缓存不同。缓存是复用某次计算结果,Fragment则是在此刻只执行一块代码。需要重新读取状态,却不想重新加载其余内容时,两者回答的是不同问题。
局部函数的返回值也不应被当成共享数据通道。文档说明,局部重跑时返回值被忽略;需要与页面其他部分共享信息,应使用Session State等明确状态。
官方例子,把开始和停止也做出来
连续更新教程展示两条折线。数据由随机函数生成,按时间加入DataFrame,保留最近100个点,再重画图表。
侧栏滑块决定检查间隔,两个按钮切换stream状态。开启时,run_every采用所选间隔;停止时,它变为None,不再自动刷新。案例没有运行AI模型,它展示的是局部更新如何与用户控制相连。
教学情境中,可以将随机数据函数换成读取已有后台任务状态,显示已完成项数或最新成果。需要替换的是数据来源;不能把一个定时刷新装饰器当成已经具备队列、重试和持久任务的完整系统。
刷新代码里做什么,仍然很重要
Fragment每次会重新执行自己的函数。若里面既读取状态又重新提交一次生成,就可能不断创建新任务。更清楚的组织是:提交由明确动作完成,状态区只读取并展示已有任务的进展。
写入文件、修改共享列表等副作用,也会随重运行累积,需要自行安排。官方还指出,不支持将缓存与Fragment装饰在同一个函数上,不能靠叠加两个装饰器期待所有重复工作自然消失。
Streamlit采用Apache-2.0,模型调用和部署另配。对于已有AI工具页面,这个能力最具体的价值,是让“任务进度在变化”与“整页重新做一遍”分开:状态能持续更新,用户也能明确开始或停止这段观察。
以上为编辑整理,功能、许可与使用条件以官方说明为准。