Skip to content

fix: 空输入时跳过 ThreadPoolExecutor 避免 max_workers=0 崩溃 (#179) - #180

Merged
zj1123581321 merged 1 commit into
zlxlabs:mainfrom
Fire162:fix/empty-input-threadpool-executor-guard
Oct 6, 2026
Merged

zj1123581321 merged 1 commit into
zlxlabs:mainfrom
Fire162:fix/empty-input-threadpool-executor-guard

Conversation

@Fire162

@Fire162 Fire162 commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

修复 #179 描述的极短音频/空转录文本进入 LLM 阶段时 ThreadPoolExecutor(max_workers=0) 抛出 ValueError 导致任务永久失败的问题。

变更内容

  1. PlainTextProcessor._calibrate_segments: 输入分段列表为空时直接返回 ([], []),不创建线程池与提交任务;process() 内文本过短且无内容时保持分段为空,统计层在分段数为 0 时报告 calibration_status=none。
  2. SpeakerAwareProcessor._calibrate_chunks: 输入分块列表为空时直接返回 ([], stats)(包含清零的统计计数与 calibration_status=none),避免 normalized_dialogs 为空时向 ThreadPoolExecutor 传入 max_workers=0。
  3. NotesProcessor.process: 在 ThreadPoolExecutor 创建前增加 mapping.slices 防御判断,为空时直接返回 NotesResult(status=FAILED)。
  4. 新增单元测试 tests/unit/test_empty_input_processors.py,并在 tests/README.md 登记,验证空分段、空对话及空文本端到端处理均正常返回且不抛异常。

验证证据

$ pytest tests/unit/test_empty_input_processors.py tests/llm/test_plain_text_calibration_stats.py tests/unit/test_speaker_aware_processor_stats.py tests/unit/test_notes_processor.py tests/unit/test_speaker_aware_no_speaker.py tests/unit/test_processor_context_propagation.py
============================== 54 passed, 78 warnings in 0.74s ==============================

@zj1123581321

Copy link
Copy Markdown
Collaborator

感谢贡献!审查结论:可合并,无阻塞问题。空文本任务现在会正常走到 success 终态(用户收到「任务完成」),不再因 max_workers=0 失败,#179 的目标达成。

为让完整门禁(含模型主审,fork PR 上会被跳过)在同一提交上运行,已开同仓镜像 #183,提交 SHA 与本 PR 完全相同;门禁全绿后会直接合并本 PR,保留你的署名。

两条非阻塞意见(P2,可以不在本 PR 处理,后续单独跟进):

  1. notes_processor.py 新增的空 slices 守卫实际不可达:NotesMappingResult.is_valid 已要求 bool(self.slices),空切片在前面 if not mapping.is_valid 处就返回 FAILED 了。对应测试 test_notes_processor_empty_slices_returns_failed_result 走的是 fingerprint mismatch 的旧校验——删掉新守卫后它仍然通过,所以并没有锁住这条分支。
  2. plain_text_processor.py 的 [text] if text.strip() else []:纯空白输入(如 " \t\n")会被归一为空串交付。不算缺陷,但目前没有测试固定这一语义。

@Fire162

Fire162 commented Oct 6, 2026

Copy link
Copy Markdown
Contributor Author

感谢详细审查和开启镜像门禁!

关于两条 P2 说明:

  1. notes_processor.py 处确实已被前面的 mapping.is_valid 防御,当时主要作为防御性兜底;若后续单独清理或重构切片校验非常赞同。
  2. plain_text_processor.py 中对纯空白输入的规整符合预期,后续如有需要可单独补充专门针对全空白字符(如 " \t\n")交付形态的断言测试。

静待门禁跑通,辛苦维护!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants