From 675caca04b1393b679834d8f60060de69dd75b61 Mon Sep 17 00:00:00 2001 From: Windpicker-owo <3431391539@qq.com> Date: Sat, 4 Oct 2025 12:39:26 +0800 Subject: [PATCH] =?UTF-8?q?fix(memory):=20=E4=BF=AE=E5=A4=8D=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E6=B8=85=E7=90=86=E4=BB=BB=E5=8A=A1=E7=9A=84=E5=BC=82?= =?UTF-8?q?=E6=AD=A5=E6=89=A7=E8=A1=8C=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot.py | 54 +++++++++++++++++- .../memory_system/vector_memory_storage_v2.py | 23 +++++--- src/main.py | 55 ++++++++++++++++--- 3 files changed, 116 insertions(+), 16 deletions(-) diff --git a/bot.py b/bot.py index 985065b99..0e8fb1c18 100644 --- a/bot.py +++ b/bot.py @@ -68,6 +68,7 @@ uvicorn_server = None driver = None app = None loop = None +main_system = None async def request_shutdown() -> bool: @@ -99,8 +100,58 @@ def easter_egg(): async def graceful_shutdown(): try: logger.info("正在优雅关闭麦麦...") + + # 首先停止服务器组件,避免网络连接被强制关闭 + try: + global server + if server and hasattr(server, 'shutdown'): + logger.info("正在关闭服务器...") + await server.shutdown() + except Exception as e: + logger.warning(f"关闭服务器时出错: {e}") + + # 停止聊天管理器 + try: + from src.chat.message_receive.chat_stream import get_chat_manager + chat_manager = get_chat_manager() + if hasattr(chat_manager, '_stop_auto_save'): + logger.info("正在停止聊天管理器...") + chat_manager._stop_auto_save() + except Exception as e: + logger.warning(f"停止聊天管理器时出错: {e}") + + # 停止情绪管理器 + try: + from src.mood.mood_manager import mood_manager + if hasattr(mood_manager, 'stop'): + logger.info("正在停止情绪管理器...") + await mood_manager.stop() + except Exception as e: + logger.warning(f"停止情绪管理器时出错: {e}") + + # 停止记忆系统 + try: + from src.chat.memory_system.memory_manager import memory_manager + if hasattr(memory_manager, 'shutdown'): + logger.info("正在停止记忆系统...") + await memory_manager.shutdown() + except Exception as e: + logger.warning(f"停止记忆系统时出错: {e}") + + # 停止MainSystem + try: + global main_system + if main_system and hasattr(main_system, 'shutdown'): + logger.info("正在停止MainSystem...") + await main_system.shutdown() + except Exception as e: + logger.warning(f"停止MainSystem时出错: {e}") + # 停止所有异步任务 - await async_task_manager.stop_and_wait_all_tasks() + try: + await async_task_manager.stop_and_wait_all_tasks() + except Exception as e: + logger.warning(f"停止异步任务管理器时出错: {e}") # 获取所有剩余任务,排除当前任务 remaining_tasks = [t for t in asyncio.all_tasks() if t is not asyncio.current_task()] @@ -233,6 +284,7 @@ if __name__ == "__main__": try: # 异步初始化数据库和表结构 main_system = loop.run_until_complete(maibot.run()) + global main_system loop.run_until_complete(maibot.initialize_database_async()) # 执行初始化和任务调度 loop.run_until_complete(main_system.initialize()) diff --git a/src/chat/memory_system/vector_memory_storage_v2.py b/src/chat/memory_system/vector_memory_storage_v2.py index 7dc36b300..5c349b584 100644 --- a/src/chat/memory_system/vector_memory_storage_v2.py +++ b/src/chat/memory_system/vector_memory_storage_v2.py @@ -226,13 +226,22 @@ class VectorMemoryStorage: if self.config.auto_cleanup_interval > 0: def cleanup_worker(): - while not self._stop_cleanup: - try: - time.sleep(self.config.auto_cleanup_interval) - if not self._stop_cleanup: - asyncio.create_task(self._perform_auto_cleanup()) - except Exception as e: - logger.error(f"定时清理任务出错: {e}") + # 在新线程中创建事件循环 + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + + try: + while not self._stop_cleanup: + try: + time.sleep(self.config.auto_cleanup_interval) + if not self._stop_cleanup: + # 在线程的事件循环中运行异步清理任务 + loop.run_until_complete(self._perform_auto_cleanup()) + except Exception as e: + logger.error(f"定时清理任务出错: {e}") + finally: + loop.close() + logger.debug("清理任务事件循环已关闭") self._cleanup_task = threading.Thread(target=cleanup_worker, daemon=True) self._cleanup_task.start() diff --git a/src/main.py b/src/main.py index 8236f7472..27c486404 100644 --- a/src/main.py +++ b/src/main.py @@ -348,16 +348,55 @@ MoFox_Bot(第三方修改版) async def schedule_tasks(self): """调度定时任务""" - while True: - tasks = [ - get_emoji_manager().start_periodic_check_register(), - self.app.run(), - self.server.run(), - ] + try: + while True: + tasks = [ + get_emoji_manager().start_periodic_check_register(), + self.app.run(), + self.server.run(), + ] - # 增强记忆系统不需要定时任务,已禁用原有记忆系统的定时任务 + # 增强记忆系统不需要定时任务,已禁用原有记忆系统的定时任务 - await asyncio.gather(*tasks) + await asyncio.gather(*tasks) + except Exception as e: + logger.error(f"调度任务发生异常: {e}") + raise + + async def shutdown(self): + """关闭系统组件""" + logger.info("正在关闭MainSystem...") + + # 关闭表情管理器 + try: + get_emoji_manager().shutdown() + logger.info("表情管理器已关闭") + except Exception as e: + logger.warning(f"关闭表情管理器时出错: {e}") + + # 关闭服务器 + try: + if self.server: + await self.server.shutdown() + logger.info("服务器已关闭") + except Exception as e: + logger.warning(f"关闭服务器时出错: {e}") + + # 关闭应用 (MessageServer可能没有shutdown方法) + try: + if self.app: + if hasattr(self.app, 'shutdown'): + await self.app.shutdown() + logger.info("应用已关闭") + elif hasattr(self.app, 'stop'): + await self.app.stop() + logger.info("应用已停止") + else: + logger.info("应用没有shutdown方法,跳过关闭") + except Exception as e: + logger.warning(f"关闭应用时出错: {e}") + + logger.info("MainSystem关闭完成") # 老记忆系统的定时任务已删除 - 增强记忆系统使用内置的维护机制