fix(ai-outfit): 停止生成打断当前目录行 + 「停止中…」反馈 (§19.24)
修「开始生成→几秒后停止→两个按钮都灰几十秒像卡死」:非死锁,是温和停止 在等当前目录行收尾,而 _generate_directory_outfit 一次性 submit 全部图片、 shutdown(wait=True) 等全跑完,停止信号进不到该循环;且 _stop 后无反馈。 - outfit_batch:run() 经 _accepts_should_stop 给 generate_func 传 should_stop (= _stop_event.is_set),2-arg 才传、1-arg 仍兼容(含既有 mock) - ai_outfit:generate_outfit_image/_generate_directory_outfit 增 should_stop; 目录循环改有界提交——始终最多 image_concurrency 张在飞,每张完成后、提交 下一张前查 should_stop,已停止则停止提交、在飞收尾即返回(结果注明 「已停止,N 张未生成」,已生成的带 output_paths) - 面板:_OutfitWorker.gen(task, should_stop) 透传;_stop() 把停止按钮改 「停止中…」;_set_running(False) 复位「停止生成」 测试:目录行 should_stop 触发后只生成到停止点、返回「已停止」结果;2-arg generate_func 收到 should_stop;既有用例(1-arg mock、目录并发/部分失败)保持绿。 全套 py37 通过(test_config_service 的 packaging 模板失败属并行 §19.13,无关)。 离屏冒烟:stop 截断 run 且 runner 及时返回;面板停止按钮「停止中…」→结束复位。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -243,7 +243,8 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只
|
||||
- `RateLimiter(新请求间隔)` 限制同一目录内每个新图片请求的启动间隔;任务间 `单任务冷却` 作用于 Excel 行之间。因为行并发固定为 1,批次的最大 HTTP 并发约等于图片并发数。
|
||||
- 每行最多「首次 + 重试次数」尝试;限流/429 用短阶梯等待,普通错误短等待。
|
||||
- 单次请求放子线程 + 主线程秒级检查,**等待 >30 秒持续打心跳日志**;超时按分辨率动态决定(512/1K/2K/4K → 180/240/360/600 秒,可被 `timeout_seconds` 覆盖)。
|
||||
- **温和停止**:置位停止后不再提交新任务,已发请求收尾后正常写回。
|
||||
- **温和停止(含目录行内打断,§19.24)**:置位停止后不再提交新 Excel 行;**当前目录行内部也据 `should_stop` 提前收尾**——`_generate_directory_outfit` 改为「有界提交」(始终最多 `图片并发数` 张在飞),每张完成后提交下一张前检查 `should_stop()`,已停止则不再提交剩余图片、让在飞的收尾即返回(结果标注「已停止,N 张未生成」,已生成的照常带 `output_paths`)。这样停止后最多再等 ~图片并发数 张图、秒级返回,而不是把当前目录整目录跑完。`should_stop` 由 `OutfitBatchRunner.run()` 传给 `generate_func`(= `self._stop_event.is_set`)。
|
||||
- **停止反馈(§19.24)**:点「停止生成」后该按钮文案变「停止中…」(保持禁用),明确是在收尾不是卡死;批次结束 `_set_running(False)` 复位为「停止生成」。期间「开始生成」仍禁用,待 `finished`/`failed` 后恢复。
|
||||
|
||||
## 9. 输出
|
||||
|
||||
|
||||
Reference in New Issue
Block a user