diff --git a/bot.py b/bot.py index d547c360..32cc52d6 100644 --- a/bot.py +++ b/bot.py @@ -14,6 +14,9 @@ from src.common.logger_manager import get_logger from src.common.crash_logger import install_crash_handler from src.main import MainSystem +from src.main import MainSystem +from src.plugins.group_nickname.nickname_processor import start_nickname_processor, stop_nickname_processor # <--- 添加这行导入 +import atexit logger = get_logger("main") confirm_logger = get_logger("confirm") @@ -221,6 +224,15 @@ def raw_main(): env_config = {key: os.getenv(key) for key in os.environ} scan_provider(env_config) + # 在这里启动绰号处理进程 + logger.info("准备启动绰号处理进程...") + start_nickname_processor() # <--- 添加启动调用 + logger.info("已调用启动绰号处理进程。") + + # 注册退出处理函数 (确保进程能被关闭) + atexit.register(stop_nickname_processor) # <--- 在这里注册停止函数 + logger.info("已注册绰号处理进程的退出处理程序。") + # 返回MainSystem实例 return MainSystem() diff --git a/src/main.py b/src/main.py index 859a4df4..c0e743d6 100644 --- a/src/main.py +++ b/src/main.py @@ -1,5 +1,4 @@ import asyncio -import atexit # 导入atexit import time from .plugins.utils.statistic import LLMStatistics from .plugins.moods.moods import MoodManager @@ -18,7 +17,6 @@ from .common.logger_manager import get_logger from .plugins.remote import heartbeat_thread # noqa: F401 from .individuality.individuality import Individuality from .common.server import global_server -from src.plugins.group_nickname.nickname_processor import start_nickname_processor, stop_nickname_processor logger = get_logger("main") @@ -179,23 +177,11 @@ class MainSystem: async def main(): """主函数""" system = MainSystem() - # 注册退出处理函数 - atexit.register(stop_nickname_processor) # <--- 添加退出处理 + await asyncio.gather( + system.initialize(), + system.schedule_tasks(), + ) - try: - # 启动绰号处理进程 - start_nickname_processor() # <--- 启动 - - await asyncio.gather( - system.initialize(), - system.schedule_tasks(), - ) - except KeyboardInterrupt: - print("程序被中断") - # finally 块不再需要手动调用 stop,atexit 会处理 - # finally: - # print("正在关闭...") - # stop_nickname_processor() # <--- 关闭 if __name__ == "__main__": - asyncio.run(main()) \ No newline at end of file + asyncio.run(main()) diff --git a/src/plugins/group_nickname/nickname_processor.py b/src/plugins/group_nickname/nickname_processor.py index c4c39cf7..a0b7d9e2 100644 --- a/src/plugins/group_nickname/nickname_processor.py +++ b/src/plugins/group_nickname/nickname_processor.py @@ -1,10 +1,7 @@ # GroupNickname/nickname_processor.py import asyncio -import threading import traceback -# 明确导入 Event 和 Queue -from multiprocessing import Process, Queue as mpQueue -from multiprocessing.synchronize import Event as mpEvent # 从 synchronize 导入 Event +from multiprocessing import Process, Queue as mpQueue, Event from typing import Dict, Optional from pymongo import MongoClient @@ -17,7 +14,7 @@ from src.common.database import db # 导入数据库初始化和关闭函数 logger = get_logger("nickname_processor") # 获取日志记录器实例 # --- 运行时状态 (用于安全停止进程) --- -_stop_event = threading.Event() +_stop_event = Event() # --- 数据库连接 --- mongo_client: Optional[MongoClient] = None # MongoDB 客户端实例 @@ -129,12 +126,13 @@ async def add_to_nickname_queue( logger.warning(f"无法将项目添加到绰号队列(可能已满): {e}", exc_info=True) -async def _nickname_processing_loop(queue: mpQueue, stop_event: mpEvent): +async def _nickname_processing_loop(queue: mpQueue, stop_event): """独立进程中的主循环,处理队列任务。""" logger.info("绰号处理循环已启动。") while not stop_event.is_set(): + logger.info("绰号处理循环正在运行...") try: if not queue.empty(): item = queue.get() @@ -149,7 +147,7 @@ async def _nickname_processing_loop(queue: mpQueue, stop_event: mpEvent): else: logger.warning(f"从队列接收到意外的项目类型: {type(item)}") - await asyncio.sleep(0.05) + await asyncio.sleep(5) else: await asyncio.sleep(global_config.NICKNAME_PROCESS_SLEEP_INTERVAL) @@ -163,7 +161,7 @@ async def _nickname_processing_loop(queue: mpQueue, stop_event: mpEvent): logger.info("绰号处理循环已结束。") -def _run_processor_process(queue: mpQueue, stop_event: mpEvent): +def _run_processor_process(queue: mpQueue, stop_event): """进程启动函数,运行异步循环。""" try: loop = asyncio.new_event_loop()