fix(chat): 确保在流取消时正确取消chatter处理任务

先前,当一个流循环(stream loop)被取消时,为其创建的 chatter 处理任务(`process_stream_context`)不会被一并取消。

这可能导致任务泄露,即“孤儿”任务在后台继续运行,消耗资源并可能引发意外行为。

本次修改引入了一个任务跟踪机制:
- `ChatterManager`现在会记录每个流正在运行的处理任务。
- 当流循环捕获到 `CancelledError` 时,它会主动取消关联的 chatter 任务。

这确保了在流停止时,相关的计算资源能够被正确、及时地释放,提高了系统的健壮性。
This commit is contained in:
tt-P607
2025-10-03 10:15:24 +08:00
parent fa9f14388a
commit b24eaba7ff
2 changed files with 18 additions and 2 deletions

View File

@@ -301,6 +301,11 @@ class StreamLoopManager:
except asyncio.CancelledError:
logger.info(f"流循环被取消: {stream_id}")
if self.chatter_manager:
task = self.chatter_manager.get_processing_task(stream_id)
if task and not task.done():
task.cancel()
logger.debug(f"已取消 chatter 处理任务: {stream_id}")
break
except Exception as e:
logger.error(f"流循环出错 {stream_id}: {e}", exc_info=True)
@@ -388,8 +393,9 @@ class StreamLoopManager:
start_time = time.time()
# 直接调用chatter_manager处理流上下文
context.processing_task = asyncio.create_task(self.chatter_manager.process_stream_context(stream_id, context))
results = await context.processing_task
task = asyncio.create_task(self.chatter_manager.process_stream_context(stream_id, context))
self.chatter_manager.set_processing_task(stream_id, task)
results = await task
success = results.get("success", False)
if success: