refactor(core): 统一和改进程序优雅关闭逻辑
将分散的关闭逻辑集中到`MainSystem`中,并由`bot.py`中的顶层异常处理块统一调用。这简化了关闭流程,提高了系统的健壮性和可维护性。 - 将信号处理逻辑从`MainSystem`移除,改由`bot.py`中的`try...finally`块处理,以捕获更广泛的退出场景(如`KeyboardInterrupt`)。 - `graceful_shutdown`函数现在接收`main_system`实例,直接调用其`shutdown`方法,实现了责任的单一化。 - 为`EmojiManager`和`VectorMemoryStorage`添加了`shutdown`/`cleanup`方法,确保其后台任务和资源能被正确清理。 - 调整了`MemorySystem`中对`unified_storage.cleanup()`的调用,使其与接口保持一致。
This commit is contained in:
43
bot.py
43
bot.py
@@ -76,7 +76,7 @@ async def request_shutdown() -> bool:
|
||||
try:
|
||||
if loop and not loop.is_closed():
|
||||
try:
|
||||
loop.run_until_complete(graceful_shutdown())
|
||||
loop.run_until_complete(graceful_shutdown(maibot.main_system))
|
||||
except Exception as ge: # 捕捉优雅关闭时可能发生的错误
|
||||
logger.error(f"优雅关闭时发生错误: {ge}")
|
||||
return False
|
||||
@@ -97,18 +97,15 @@ def easter_egg():
|
||||
logger.info(rainbow_text)
|
||||
|
||||
|
||||
async def graceful_shutdown():
|
||||
async def graceful_shutdown(main_system_instance):
|
||||
"""优雅地关闭所有系统组件"""
|
||||
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}")
|
||||
# 停止MainSystem中的组件,它会处理服务器等
|
||||
if main_system_instance and hasattr(main_system_instance, 'shutdown'):
|
||||
logger.info("正在关闭MainSystem...")
|
||||
await main_system_instance.shutdown()
|
||||
|
||||
# 停止聊天管理器
|
||||
try:
|
||||
@@ -138,14 +135,6 @@ async def graceful_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}")
|
||||
|
||||
# 停止所有异步任务
|
||||
try:
|
||||
@@ -178,6 +167,15 @@ async def graceful_shutdown():
|
||||
# 关闭日志系统,释放文件句柄
|
||||
shutdown_logging()
|
||||
|
||||
# 尝试停止事件循环
|
||||
try:
|
||||
loop = asyncio.get_running_loop()
|
||||
if loop.is_running():
|
||||
loop.stop()
|
||||
logger.info("事件循环已请求停止")
|
||||
except RuntimeError:
|
||||
pass # 没有正在运行的事件循环
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"麦麦关闭失败: {e}", exc_info=True)
|
||||
|
||||
@@ -305,18 +303,13 @@ if __name__ == "__main__":
|
||||
if "loop" in locals() and loop and not loop.is_closed():
|
||||
logger.info("开始执行最终关闭流程...")
|
||||
try:
|
||||
loop.run_until_complete(graceful_shutdown())
|
||||
# 传递main_system实例
|
||||
loop.run_until_complete(graceful_shutdown(maibot.main_system))
|
||||
except Exception as ge:
|
||||
logger.error(f"优雅关闭时发生错误: {ge}")
|
||||
loop.close()
|
||||
logger.info("事件循环已关闭")
|
||||
|
||||
# 关闭日志系统,释放文件句柄
|
||||
try:
|
||||
shutdown_logging()
|
||||
except Exception as e:
|
||||
print(f"关闭日志系统时出错: {e}")
|
||||
|
||||
# 在程序退出前暂停,让你有机会看到输出
|
||||
# input("按 Enter 键退出...") # <--- 添加这行
|
||||
sys.exit(exit_code) # <--- 使用记录的退出码
|
||||
|
||||
Reference in New Issue
Block a user