feat(chat): 增强任务管理和取消机制
添加新的任务管理方法来更好地处理异步任务的生命周期: - 新增 cancel_processing_task、remove_processing_task 等方法 - 在流循环清理时自动取消关联的 chatter 处理任务 - 添加活跃任务统计信息到管理器统计中 - 改进 prompt 构建时的任务类型检查和错误处理
This commit is contained in:
@@ -68,33 +68,31 @@ class StreamLoopManager:
|
||||
|
||||
# 取消所有流循环
|
||||
try:
|
||||
# 使用带超时的锁获取,避免无限等待
|
||||
lock_acquired = await asyncio.wait_for(self.loop_lock.acquire(), timeout=10.0)
|
||||
if not lock_acquired:
|
||||
logger.error("停止管理器时获取锁超时")
|
||||
else:
|
||||
# 创建任务列表以便并发取消
|
||||
cancel_tasks = []
|
||||
for stream_id, task in list(self.stream_loops.items()):
|
||||
if not task.done():
|
||||
task.cancel()
|
||||
cancel_tasks.append((stream_id, task))
|
||||
|
||||
# 并发等待所有任务取消
|
||||
if cancel_tasks:
|
||||
logger.info(f"正在取消 {len(cancel_tasks)} 个流循环任务...")
|
||||
await asyncio.gather(
|
||||
*[self._wait_for_task_cancel(stream_id, task) for stream_id, task in cancel_tasks],
|
||||
return_exceptions=True
|
||||
)
|
||||
|
||||
# 取消所有活跃的 chatter 处理任务
|
||||
if self.chatter_manager:
|
||||
try:
|
||||
# 创建任务列表以便并发取消
|
||||
cancel_tasks = []
|
||||
for stream_id, task in list(self.stream_loops.items()):
|
||||
if not task.done():
|
||||
task.cancel()
|
||||
cancel_tasks.append((stream_id, task))
|
||||
cancelled_count = await self.chatter_manager.cancel_all_processing_tasks()
|
||||
logger.info(f"已取消 {cancelled_count} 个活跃的 chatter 处理任务")
|
||||
except Exception as e:
|
||||
logger.error(f"取消 chatter 处理任务时出错: {e}")
|
||||
|
||||
# 并发等待所有任务取消
|
||||
if cancel_tasks:
|
||||
logger.info(f"正在取消 {len(cancel_tasks)} 个流循环任务...")
|
||||
await asyncio.gather(
|
||||
*[self._wait_for_task_cancel(stream_id, task) for stream_id, task in cancel_tasks],
|
||||
return_exceptions=True
|
||||
)
|
||||
|
||||
self.stream_loops.clear()
|
||||
logger.info("所有流循环已清理")
|
||||
finally:
|
||||
self.loop_lock.release()
|
||||
except asyncio.TimeoutError:
|
||||
logger.error("停止管理器时获取锁超时")
|
||||
self.stream_loops.clear()
|
||||
logger.info("所有流循环已清理")
|
||||
except Exception as e:
|
||||
logger.error(f"停止管理器时出错: {e}")
|
||||
|
||||
@@ -193,31 +191,15 @@ class StreamLoopManager:
|
||||
except Exception as e:
|
||||
logger.error(f"等待流循环任务结束时出错: {stream_id} - {e}")
|
||||
|
||||
try:
|
||||
# 双重检查:在获取锁后再次检查流是否存在
|
||||
if stream_id not in self.stream_loops:
|
||||
logger.debug(f"流 {stream_id} 循环不存在(双重检查)")
|
||||
return False
|
||||
# 取消关联的 chatter 处理任务
|
||||
if self.chatter_manager:
|
||||
cancelled = self.chatter_manager.cancel_processing_task(stream_id)
|
||||
if cancelled:
|
||||
logger.info(f"已取消关联的 chatter 处理任务: {stream_id}")
|
||||
|
||||
task = self.stream_loops[stream_id]
|
||||
if not task.done():
|
||||
task.cancel()
|
||||
try:
|
||||
# 设置取消超时,避免无限等待
|
||||
await asyncio.wait_for(task, timeout=5.0)
|
||||
except asyncio.CancelledError:
|
||||
logger.debug(f"流循环任务已取消: {stream_id}")
|
||||
except asyncio.TimeoutError:
|
||||
logger.warning(f"流循环任务取消超时: {stream_id}")
|
||||
except Exception as e:
|
||||
logger.error(f"等待流循环任务结束时出错: {stream_id} - {e}")
|
||||
|
||||
del self.stream_loops[stream_id]
|
||||
logger.info(f"停止流循环: {stream_id} (剩余: {len(self.stream_loops)})")
|
||||
return True
|
||||
finally:
|
||||
# 确保锁被释放
|
||||
self.loop_lock.release()
|
||||
del self.stream_loops[stream_id]
|
||||
logger.info(f"停止流循环: {stream_id} (剩余: {len(self.stream_loops)})")
|
||||
return True
|
||||
|
||||
async def _stream_loop(self, stream_id: str) -> None:
|
||||
"""单个流的无限循环
|
||||
@@ -278,10 +260,12 @@ 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}")
|
||||
# 使用 ChatterManager 的新方法取消处理任务
|
||||
cancelled = self.chatter_manager.cancel_processing_task(stream_id)
|
||||
if cancelled:
|
||||
logger.info(f"成功取消 chatter 处理任务: {stream_id}")
|
||||
else:
|
||||
logger.debug(f"没有需要取消的 chatter 处理任务: {stream_id}")
|
||||
break
|
||||
except Exception as e:
|
||||
logger.error(f"流循环出错 {stream_id}: {e}", exc_info=True)
|
||||
|
||||
Reference in New Issue
Block a user