远程服务器断开连接后如何恢复tqdm进度条显示
tqdm 断连后进度恢复方案
tqdm 本身内置了支持进度持久化、断点续显的相关参数,以下是两种可直接落地的实现方案:
方案一:手动持久化进度到本地文件
你可以搭配 initial 参数和自定义持久化逻辑,实现断连后完全恢复进度展示,代码修改量极小:
import json from tqdm import tqdm # 自定义进度持久化文件路径,放在进程可正常读写的目录即可 PROGRESS_RECORD = "./tqdm_progress.json" # 启动时先读取已有进度,无历史记录则默认从0开始 current_progress = 0 try: with open(PROGRESS_RECORD, "r", encoding="utf-8") as f: current_progress = json.load(f)["idx"] except (FileNotFoundError, json.JSONDecodeError): pass # 必须指定total参数,才能正确计算进度比例 for idx, data in tqdm(enumerate(dataloader), disable=silence, initial=current_progress, total=len(dataloader)): # 原有业务逻辑写在这里 # ------ # 每次迭代更新持久化记录,也可以每10/100次迭代更新一次减少IO消耗 with open(PROGRESS_RECORD, "w", encoding="utf-8") as f: json.dump({"idx": idx + 1}, f)
断连重连后,你可以直接读取持久化文件的数值知道当前进度,也可以单独运行一段简单代码恢复进度条展示,把读取到的进度值传入tqdm的initial参数即可。
方案二:直接输出tqdm日志到文件
如果不需要自定义持久化逻辑,也可以直接把tqdm的输出流指向日志文件,所有进度更新都会自动写入文件:
from tqdm import tqdm # 打开日志文件用于写入进度 log_f = open("./tqdm_run.log", "a", encoding="utf-8") for idx, data in tqdm(enumerate(dataloader), disable=silence, file=log_f, total=len(dataloader)): # 原有业务逻辑 ...
重连后执行tail -f ./tqdm_run.log就能实时看到最新的进度条输出,和原来在Jupyter里看到的效果一致。
额外优化建议
如果经常遇到SSH断连场景,推荐用tmux或screen这类终端复用工具启动Jupyter Lab或Python进程,就算SSH连接断开,下次重连后attach回原有会话,就能直接看到原本的进度条,不需要修改任何tqdm代码。
内容的提问来源于stack exchange,提问作者Андрей Севостьянов
相关产品推荐
相关产品推荐

