Loading skill
Install any skill in seconds. Free to start, no credit card required.
Get Started Free →覆盖批量任务完整生命周期:参数叉乘创建、猴子补丁钩子追踪队列提交与执行、状态聚合状态机、队列中断取消、文件清理删除。 导航时机:理解批量任务从创建到完成的全流程、调试端到端任务生命周期问题、修改任务状态转换、排查任务卡住、新增生命周期阶段或状态。 排除:结果处理与输出媒体处理(见 ../result-processing/)、资源上传管理、前端UI逻辑。 关键词: 批量任务生命周期, createBatchTask, cancelTask, deleteTask, post_prompt, task_start, task_done, BatchToolsHandler, SubTaskStatus, CommonTaskStatus, prompt_queue, 猴子补丁, 参数叉乘, 状态聚合, 队列执行, 文件清理, SQLite WAL。
.claude/skills/bytedance-knowledge-batch-task-lifecycle/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 65% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 61% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 67% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 73% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 181% | 0% |
批量任务生命周期域管理ComfyUI批量处理任务的完整生命周期。它是一个ComfyUI自定义节点扩展,封装ComfyUI的prompt执行系统以支持参数化批量执行:用户配置参数组合,系统计算笛卡尔积生成多个prompt变体,提交到ComfyUI队列,通过猴子补丁钩子追踪执行,跨子任务聚合状态,处理取消和清理。
lumi_batcher_service/handler/batch_tools.py — 核心API处理器(BatchToolsHandler单例),包含所有HTTP端点、参数叉乘引擎、prompt队列提交lumi_batcher_service/hooks/ — 通过猴子补丁进行生命周期事件拦截task_start.py — 拦截执行开始事件task_done.py — 拦截执行完成、聚合状态、触发打包patch_wrpper.py — 通用猴子补丁装饰器工具lumi_batcher_service/controller/task/ — 任务操作控制器update_prompt.py — 参数注入ComfyUI prompt图update_workflow.py — 参数注入workflow UI表示cancel_queue.py — 队列取消与中断逻辑lumi_batcher_service/common/ — 共享工具validate_prompt.py — Prompt校验兼容包装delete_file.py — 异步并发文件删除file_path.py — 路径安全白名单校验(被handler引用)lumi_batcher_service/dao/ — SQLite数据访问层batch_task.py — 批量任务CRUD与重启恢复batch_sub_task.py — 子任务CRUD(含重试逻辑)lumi_batcher_service/constant/task.py — 状态枚举与数据类lumi_batcher_service/thread/ — 后台线程task_scheduler_manager.py — 线程执行工具check_status.py — 后备状态轮询线程__init__.py(项目根目录)— 扩展入口点:实例化handler、注册钩子BatchToolsHandler.__init__() 在 lumi_batcher_service/handler/batch_tools.py — 服务初始化、DB设置、路由注册、重启恢复createBatchTask POST /api/comfyui-lumi-batcher/batch-task/create — 任务创建APIcancelTask POST /api/comfyui-lumi-batcher/batch-task/cancel — 任务取消APIdeleteTask POST /api/comfyui-lumi-batcher/batch-task/delete — 任务删除API__init__.py中的batch_tools_task_start_hook()、batch_tools_task_done_hook()BatchToolsHandler通过__init__中设置的instance = None类变量使用单例模式,但没有强制保护——如果意外实例化两次,路由会被注册两次,钩子重复补丁自身,导致状态更新双重执行(lumi_batcher_service/handler/batch_tools.py)__init__中路由注册之前运行,根据已记录的计数将所有未完成任务标记为SUCCESS/PARTIAL_SUCCESS/FAILED——但重启时已排队但从未开始的子任务(PENDING)不会从子任务表中清理,遗留孤儿记录(lumi_batcher_service/handler/batch_tools.py, lumi_batcher_service/dao/batch_task.py)__init__.py, lumi_batcher_service/hooks/patch_wrpper.py)number参数控制队列优先级:-1插入队首,数值设置优先级,但post_prompt仅在未提供显式number时才递增server.PromptServer.instance.number——如果批量中所有任务都使用显式number,服务端计数器不会前进,可能导致number冲突(lumi_batcher_service/handler/batch_tools.py)lib.comfy_patch.batch_tools_patch)导入,表明存在遗留/双代码路径(lumi_batcher_service/thread/check_status.py)lumi_batcher_service/handler/batch_tools.py)extra字段将output_nodes和原始prompt存储为JSON——这在task_done时用于解析输出,但如果prompt很大(复杂工作流常见),由于prompt也嵌入在每条子任务记录中,每批量任务的存储量翻倍(lumi_batcher_service/handler/batch_tools.py)PromptServer.instance.routes装饰器在/api/comfyui-lumi-batcher/下注册HTTP路由——不启动独立Web服务器(lumi_batcher_service/handler/batch_tools.py)PromptServer.send_sync(WebSocket消息)和PromptQueue.task_done(执行完成),确保原始行为始终被保留(lumi_batcher_service/hooks/task_start.py, lumi_batcher_service/hooks/task_done.py)batch_task_id关联;子任务与ComfyUI prompt_id 1:1映射(lumi_batcher_service/dao/batch_task.py, lumi_batcher_service/dao/batch_sub_task.py)batch_tools.db存储在WorkSpaceManager管理的工作空间目录下comfyui_lumi_batcher_workspace/db/(lumi_batcher_service/handler/batch_tools.py)itertools.product对参数维度做叉乘,"group"类型支持类似zip的并行参数绑定(组内参数联动变化,非独立叉乘)(lumi_batcher_service/handler/batch_tools.py)WorkSpaceManager管理,抽象化文件系统路径(lumi_batcher_service/handler/batch_tools.py)web.json_response和getErrorResponse(e, "操作失败");顶部解析请求、中间DAO调用、末尾构建响应(lumi_batcher_service/handler/batch_tools.py)with sqlite3.connect(...))管理连接生命周期,SQL语句通过read_sql_file()从外部.sql文件加载——SQL不内嵌在Python代码中(lumi_batcher_service/dao/batch_task.py, lumi_batcher_service/dao/batch_sub_task.py)asyncio.new_event_loop())或线程执行器(run_in_executor、RunInThread),因为ComfyUI执行路径是同步的而文件I/O和打包是异步的(lumi_batcher_service/hooks/task_done.py, lumi_batcher_service/thread/task_scheduler_manager.py)is_under_delete_white_dir、is_under_lumi_batcher)强制路径安全,防止跨所有文件服务端点的路径遍历攻击(lumi_batcher_service/handler/batch_tools.py)copy.deepcopy),防止跨迭代修改模板(lumi_batcher_service/handler/batch_tools.py)getApiPath()辅助函数以/api/comfyui-lumi-batcher前缀注册,遵循REST风格路径:/batch-task/create、/batch-task/cancel、/batch-task/delete、/batch-task/list、/batch-task/detail、/batch-task/result(lumi_batcher_service/handler/batch_tools.py)"running"、"success")而非整数,简化JSON序列化;CommonTaskStatus(批量)和SubTaskStatus(子任务)共享相同的终态字符串(lumi_batcher_service/constant/task.py)lumi_batcher_service/hooks/task_start.py, lumi_batcher_service/hooks/task_done.py)insert.sql、delete.sql、update_status.sql、get_task_by_prompt_id.sql等,存储在sql/batch-task/和sql/batch-sub-task/目录下(lumi_batcher_service/dao/batch_task.py, lumi_batcher_service/dao/batch_sub_task.py)server.PromptServer用于路由注册和队列访问、execution.validate_prompt用于prompt校验、execution.SENSITIVE_EXTRA_DATA_KEYS用于auth token处理、nodes.interrupt_processing用于取消、folder_paths用于输出目录解析custom_nodes/目录加载——项目根的__init__.py按ComfyUI自定义节点约定导出NODE_CLASS_MAPPINGS、NODE_INSTANCE_MAPPINGS和WEB_DIRECTORY(__init__.py)task_done钩子中通过统计已完成子任务数相对于总queue_count计算;到终态(SUCCESS/PARTIAL_SUCCESS/FAILED/CANCELLED)的转换不可逆转——一旦终态,迟到结果被忽略lumi_batcher_service/dao/batch_task.py, lumi_batcher_service/dao/batch_sub_task.py)./task-creation-params/SKILL.md — 导航时机:修改参数叉乘逻辑、调试prompt/workflow注入、排查任务创建失败、新增参数类型./task-queue-execution/SKILL.md — 导航时机:调试任务状态转换、修改生命周期钩子、排查任务卡住、理解状态机行为./task-cancel-delete/SKILL.md — 导航时机:实现取消、调试队列中断、新增文件清理逻辑、理解路径安全机制Other measured skills in the registry, with their headline benchmark lift.