这个坑值得记一笔。夜里跑两万条文本摘要,跑到 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 行数与输入条数一致,无重复也无缺口。

容易忽略的是,长任务的重点不是快,而是随时能停能续,每处理一条就落一次盘,代价很小却能救整晚。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189