You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:26:11