Skip to content

飞书子进程等待退出时,哨兵先于退出码就绪也不再断言失败 - #121

Merged
wxkingstar merged 1 commit into
mainfrom
claude/forked-process-wait-race
Oct 10, 2026
Merged

wxkingstar merged 1 commit into
mainfrom
claude/forked-process-wait-race

Conversation

@wxkingstar

Copy link
Copy Markdown
Owner

问题

#120 合并后主干 CI 连续两次失败在 tests/unit/test_feishu_forkserver.py::test_forked_process_reports_exit_code(coreman/runtime/gateway_feishu/service.py:81: AssertionError),发布脚本因 CI 未通过而拒绝部署。

ForkedProcess.wait() 等进程哨兵可读后直接读 exitcode 并断言不为空。spawn 等启动方式下哨兵是子进程退出时关闭的管道,Linux 上 waitpid(WNOHANG) 可能要稍后才能回收,于是退出码还是 None。生产用 forkserver,哨兵里写的就是退出码,基本不受影响;但 wait 不该在这种时序上断言失败。

改动

  • 哨兵可读后如果还拿不到退出码,在线程里 join 一次(进程已退出,很快返回)再读。
  • 新增用例模拟「哨兵已可读、退出码未就绪」。

验证

uv run pytest tests/unit/test_feishu_forkserver.py:6 passed;ruff、mypy 通过。本机 macOS 复现不了原失败,CI(Linux)上验证。

🤖 Generated with Claude Code

- ForkedProcess.wait 在哨兵可读后若还拿不到退出码,在线程里 join 一次再读;
  spawn 等启动方式下哨兵是子进程退出时关闭的管道,waitpid 要稍后才能回收。
- 主干 CI(Linux)上 test_forked_process_reports_exit_code 因此连续两次失败,挡住发布。
- 新增用例模拟「哨兵已可读、退出码未就绪」。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@wxkingstar
wxkingstar merged commit faaa684 into main Oct 10, 2026
5 checks passed
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.

1 participant