使用stqdm.pandas.progress_apply中断后应用无限循环问题求助
解决Streamlit中断后进度操作无限循环的问题
问题根源
stqdm和Streamlit的会话管理机制适配不佳,中断操作后进程内残留了未终止的进度迭代状态,下次启动时会复用这个错误状态导致无限循环。
可行解决方案
1. 改用Streamlit原生进度条替代stqdm
放弃第三方的stqdm,用Streamlit自带的st.progress()手动控制进度,完全掌控进度更新逻辑,避免状态残留。
2. 添加会话活跃性检测
在耗时操作中实时检查当前Streamlit会话是否仍处于活跃状态,一旦会话中断(比如关闭标签页),立即终止任务执行,防止无效循环。
修改后的代码示例
import streamlit as st from time import sleep import pandas as pd import numpy as np from streamlit.runtime.scriptrunner import get_script_run_ctx def something_heavy(x): sleep(1) return x * 100 # 初始化DataFrame df = pd.DataFrame(np.random.randint(0, 100, size=(10, 2)), columns=list('AB')) df['C'] = 0 # 获取当前会话上下文 ctx = get_script_run_ctx() # 创建原生进度条 progress_bar = st.progress(0, text='Doing smth heavy') total_rows = len(df) # 手动遍历行并处理,同时检查会话状态 for idx, row in df.iterrows(): # 检查当前会话是否仍活跃,若已中断则终止循环 if not ctx or not ctx.session_id in st.runtime.get_instance()._session_infos: st.warning('任务已中断') break # 执行耗时操作 df.loc[idx, 'C'] = something_heavy(row['A']) # 更新进度条 progress = (idx + 1) / total_rows progress_bar.progress(progress, text=f'Doing smth heavy ({int(progress*100)}%)') # 显示结果 st.write(df)
额外说明
- 原生进度条完全由你控制,不会出现第三方库的状态残留问题;
- 会话检测逻辑能在用户中断操作后立即停止任务,避免不必要的计算,同时防止下次启动时的状态污染;
- 如果仍想使用tqdm风格的进度条,可以考虑用
streamlit-tqdm的最新版本,或者在每次运行前强制重置tqdm的状态,但原生方案稳定性更高。
内容的提问来源于stack exchange,提问作者Smolenskii Ilya
相关产品推荐
相关产品推荐

