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

开源项目猫目发布于 来源:Streamlit 官方资料
官方折线图案例用run_every定时更新,还能开始和停止;模型推理与状态轮询可以据此分开组织。
只刷新任务状态那一块,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工具页面,这个能力最具体的价值,是让“任务进度在变化”与“整页重新做一遍”分开:状态能持续更新,用户也能明确开始或停止这段观察。

原始资料:Streamlit 官方资料

以上为编辑整理,功能、许可与使用条件以官方说明为准。

返回每日分享