wenyi文译Web工作进程故障恢复指南:中断任务如何自动标记与续跑,进度永不丢失

发布时间:2026/10/1 13:21:50
wenyi文译Web工作进程故障恢复指南:中断任务如何自动标记与续跑,进度永不丢失 wenyi文译Web工作进程故障恢复指南中断任务如何自动标记与续跑进度永不丢失【免费下载链接】wenyi将被语言阻隔的作品带到读者的语言中。Bringing literature into your language.项目地址: https://gitcode.com/gh_mirrors/we/wenyiwenyi文译是一个开源的长文本翻译 Web 引擎能把被语言阻隔的书籍、字幕等作品带到读者的语言中。整本书的翻译动辄运行数小时网络波动、服务重启都可能导致后台工作进程意外停止。本文将完整讲解 wenyi 的故障恢复机制中断任务如何被自动标记、已完成的进度为何永不丢失以及如何一键续跑从断点继续帮助新手安心运行长时间翻译任务。一、为什么长任务会中断中断后会发生什么wenyi 的 Web 端采用API 后台工作进程的架构前端发起翻译后真正的解析、翻译、审校、导出工作都交给独立的后台工作进程基于 Redis 队列异步执行工作流与导出各用一条队列。长任务运行期间可能遇到这些情况服务器重启、进程被杀kill、OOM 等队列服务Redis短暂不可用任务卡在队列里无人执行工作进程崩溃但数据库里的任务状态还停留在运行中。如果什么都不做界面会永远显示翻译中进度和已花费的 Token 全部变成一笔糊涂账。wenyi 的做法是让状态可信、让进度落盘、让续跑一键可达。如上图所示wenyi 的翻译总览页会记录每一次运行的时长与状态完成、失败、暂停这是理解故障恢复的直观入口每次中断和续跑都会在这里留下可追溯的痕迹。二、自动标记每 30 秒巡检一次的中断检测核心逻辑位于 recovery.py。工作进程启动时会拉起一个恢复循环见 workers/__init__.py它独立于业务任务运行每 30 秒做一次巡检找出疑似中断的任务扫描数据库中状态为排队中/运行中、且超过 2 分钟没有任何更新的任务。2 分钟的宽限期是为了避免误伤刚从数据库写入、还没进队列的正常任务。用会话锁确认进程已死每个项目的工作进程执行期间都持有 PostgreSQL 的会话锁。锁还在 → 进程大概率还活着跳过锁拿不到 → 说明原工作进程已经不存在即使 Redis 里还残留着进行中的标记也判定为中断。区分任务类型打上正确的状态翻译/审校等工作流任务→ 标记为interrupted已中断项目状态置为paused已暂停并写入task_interrupted事件日志导出任务→ 标记为error错误提示导出未完成请新建导出重试因为渲染结果没有断点价值。这套时间戳 会话锁的双重判断非常关键它既不会把还在跑的任务误判为死任务也不会让死任务永远挂在运行中。 为什么是 2 分钟宽限期因为任务从写入数据库到真正入队中间存在正常的间隔。短于这个时间就巡检可能误判长太多则状态失真的时间过长。三、进度为何永不丢失章节级断点与原子写入自动标记只是止血真正的底气来自进度从落盘那一刻起就是完整的。wenyi 的核心运行状态由 runstore.py 管理每本书拥有独立的状态目录文件作用中断保护manifest.json章节清单与每章完成状态原子写入中断不会留下半截文件chapters/ch{n}.json每章已翻译的原文与译文逐章落盘翻译完一章存一章usage.json累计 Token 用量用量先写入暂存账本续跑时自动补记events.jsonl追加式事件日志只增不改完整记录每次运行三个设计让永不丢失成立章节粒度断点每完成一章就原子更新manifest.json先写临时文件再原子替换见 _write_json进程即使瞬间被杀磁盘上也只有完整的上一章或完整的下一章没有中间态。原文指纹校验初始化时记录源文件的 SHA-256source_sha256续跑前会校验文件没被改动防止拿着旧进度翻译新文件。配置快照随任务持久化任务入队时会把当时的完整配置快照存入任务参数见 job_service.py续跑复用快照而不是读取可能被改过的当前配置保证续的就是原来那一段。四、一键续跑从断点继续的完整链路当项目状态为paused、error或interrupted时界面上会提供续跑操作。它对应 projects.py 的/resume接口链路清晰通过 latest_resumable_job 找到该项目最近一次可续跑的任务状态为暂停/错误/中断的最新工作流任务带着原始任务参数含配置快照重新入队新工作进程启动后从manifest.json读取已完成章节跳过所有已翻译章节直接从第一个未完成的章节继续Token 用量在usage.json上累加不会重复计费。此外还有两道防串线保险旧任务投递不可覆盖新工作如果 Redis 里残留着旧任务的投递执行前会先核对当前最新任务是否还是自己见 tasks.py不是则直接丢弃避免幽灵任务覆盖你的新进度。暂停是在安全边界停下手动暂停不会硬杀进程而是在章节边界优雅收尾并落盘见 PauseRequested所以暂停与崩溃后的恢复路径完全一致。上图的人工校阅页显示已保存 5/5 段——这正是章节级断点的另一面无论自动翻译进行到哪里已落盘的内容都稳定可查续跑时也不会重复翻译已完成部分。五、给普通用户的实用建议中断后不要急着新建项目先点续跑。除非源文件本身发生了变更指纹校验会拒绝不一致的源否则新建项目会丢失全部已完成的章节进度。导出中断需重新发起导出没有断点概念标记为错误后新建一次导出即可不会消耗模型费用。关注事件日志每次task_interrupted、task_paused、task_completed都会写入追加式事件日志events.jsonl需要排查到底断在哪一步时它是第一手证据。部署时把 API、工作进程、数据库分开重启恢复循环运行在工作进程中只要工作进程能重新拉起它会自动完成对历史中断任务的标记无需人工干预。小结wenyi 的故障恢复体系由三块拼图构成30 秒一次的自动巡检负责把死掉的任务从运行中诚实地改标为已中断章节级原子落盘 原文指纹 配置快照负责让进度在任何时刻都是完整、可信的一键续跑负责从断点继续不重复劳动、不重复计费。对使用者来说它把长任务怕中断的焦虑变成了一次无感的继续。更多架构细节可参考项目文档docs/zh/architecture.md、docs/zh/pipeline.md核心源码位于 apps/api/wenyi_api/workers/ 与 packages/core/wenyi_core/pipeline/。【免费下载链接】wenyi将被语言阻隔的作品带到读者的语言中。Bringing literature into your language.项目地址: https://gitcode.com/gh_mirrors/we/wenyi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考