Prhub

#20276 [HiCache] fix: graceful shutdown of pending async tasks in bench_mix.py

原始 PR 作者 alphabetc1 合并时间 2026-03-29 15:46 文件变更 1 提交数 2 评论 1 代码增减 +8 / -1

执行摘要

修复 bench_mix.py 中异步任务优雅关闭,避免 benchmark 输出误导性错误。

根据PR body,benchmark成功但输出'Event loop is closed'和'Task was destroyed but it is pending'等错误消息,这些是纯粹的关闭问题。根因是request_sender关闭event loop时,handle_request任务仍在等待HTTP响应,导致孤儿任务被强制销毁产生虚假错误输出。

对于负责benchmark脚本或异步编程的工程师,建议阅读此PR以学习优雅关闭异步任务的最佳实践。代码改动简单,但展示了重要的asyncio模式,值得关注其错误处理设计。

讨论亮点

review中仅有一次评论,来自gemini-code-assist[bot],指出实现正确并遵循asyncio任务管理最佳实践。没有争议或未解决疑虑,变更被hnyls2002批准合并。

实现拆解

仅修改了benchmark/hicache/bench_mix.py文件中的request_loop函数。关键改动:引入tasks列表跟踪所有asyncio.create_task创建的任务;在循环退出条件满足时,遍历tasks列表调用task.cancel(),然后使用await asyncio.gather(*tasks, return_exceptions=True)等待所有任务完成,确保在关闭event loop前优雅处理待定任务。

文件 模块 状态 重要度
benchmark/hicache/bench_mix.py benchmark/hicache modified 5.0

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

关键符号

request_loop

评论区精华

优雅关闭异步任务的正确性 正确性

gemini-code-assist[bot] commented that the implementation is sound and follows best practices for asyncio task management.

结论:变更被批准合并,解决了关闭问题。 · 已解决

风险与影响

风险较低。改动涉及异步任务取消逻辑,如果任务处理异常不当,可能导致未处理的异常或潜在死锁,但使用了return_exceptions=True可以捕获异常,减少风险。此外,只影响benchmark脚本的关闭过程,不涉及核心业务逻辑,回归风险小。

对用户影响:benchmark输出更清晰,不再有误导性错误,提升用户体验和调试便利性。对系统影响:无性能或功能影响,仅改善关闭行为。对团队影响:代码维护性提高,为类似异步任务管理提供范例,有助于其他开发人员学习最佳实践。

低风险变更 异步任务管理

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

执行摘要

本次PR修复了bench_mix.py benchmark脚本在成功运行后输出误导性错误消息的问题,通过引入异步任务优雅关闭机制,实现了干净的退出,提升用户体验和代码可维护性。

功能与动机

bench_mix.py benchmark完成时,由于event loop提前关闭而pending的异步任务被强制销毁,导致输出大量"Event loop is closed"和"Task was destroyed but it is pending"错误消息,尽管benchmark实际成功。这混淆了用户,因此需要修复以提供清晰的输出,避免误导性错误干扰性能评估。

实现拆解

仅修改了benchmark/hicache/bench_mix.py文件中的request_loop函数:

  • 在函数内部添加tasks列表,用于跟踪所有通过asyncio.create_task创建的任务。
  • 修改任务创建逻辑:将asyncio.create_task(self.handle_request(new_request))改为task = asyncio.create_task(self.handle_request(new_request)); tasks.append(task)
  • 在循环退出时,添加代码取消所有任务并等待完成:
    for task in tasks:
        task.cancel()
    await asyncio.gather(*tasks, return_exceptions=True)
    

评论区精华

review中仅有一次评论,来自gemini-code-assist[bot]:

"The implementation is sound and follows best practices for asyncio task management."

没有其他讨论或争议,变更被迅速批准,表明实现方案得到认可。

风险与影响

  • 风险:低。异步任务取消可能引入异常处理问题,但使用return_exceptions=True减少了风险;只影响benchmark关闭逻辑,不涉核心路径,回归风险小。
  • 影响:正面。用户获得更干净的benchmark输出,团队代码库增加了异步任务管理的范例,有助于提高其他类似场景的代码质量。

关联脉络

从历史PR看,PR #21294也涉及benchmark脚本的修复,两者都旨在提高测试工具的可靠性。这表明团队持续优化benchmark基础设施以支持更稳定的性能评估,未来可能在其他benchmark文件中推广类似优雅关闭模式。

参与讨论