这个坑值得记一笔。夜里跑两万条文本摘要,跑到 1.3 万条时连续 529,脚本直接抛出异常退出,第二天重跑从头开始,白烧了一晚上的额度。
刚开始盯着「完成标记写在最后一步,中途退出等于零进度」,折腾了半个多小时,排掉了。
排查方向其实有限,先把可能性排一排。循环里没有把每条结果落盘,异常一出全丢;重试只包住单次请求,没兜住整体任务;用内存里的序号做进度,进程重启后就对不上。
上来先改成逐条追加写入并带唯一 id
python -c "import json;open('done.jsonl','a').write(json.dumps({'id':'x','ok':True})+'\n')"
再往下启动时先读已完成 id 跳过
python -c "done={json.loads(l)['id'] for l in open('done.jsonl')};print(len(done))"
给整体任务加退避重试上限
python run_batch.py --max-retries 5 --backoff 2,4,8,16,32
别只看报错消失,验证要多做一步。断点续跑后剩余条数等于总数减已完成数,done.jsonl 行数与输入条数一致,无重复也无缺口。
容易忽略的是,长任务的重点不是快,而是随时能停能续,每处理一条就落一次盘,代价很小却能救整晚。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
