diff --git a/app/api/endpoints/system.py b/app/api/endpoints/system.py index b194cac0..891b3713 100644 --- a/app/api/endpoints/system.py +++ b/app/api/endpoints/system.py @@ -306,8 +306,8 @@ def reload_module(_: schemas.TokenPayload = Depends(verify_token)): """ 重新加载模块 """ - ModuleManager().stop() - ModuleManager().load_modules() + ModuleManager().reload() + Scheduler().init() return schemas.Response(success=True) diff --git a/app/command.py b/app/command.py index e6b907b8..12e069e1 100644 --- a/app/command.py +++ b/app/command.py @@ -267,7 +267,10 @@ class Command(metaclass=Singleton): 停止事件处理线程 """ self._event.set() - self._thread.join() + try: + self._thread.join() + except Exception as e: + logger.error(f"停止事件处理线程出错:{str(e)} - {traceback.format_exc()}") def get_commands(self): """ diff --git a/app/core/module.py b/app/core/module.py index 1f4e4c47..685074f6 100644 --- a/app/core/module.py +++ b/app/core/module.py @@ -51,6 +51,13 @@ class ModuleManager(metaclass=Singleton): if hasattr(module, "stop"): module.stop() + def reload(self): + """ + 重新加载所有模块 + """ + self.stop() + self.load_modules() + def test(self, modleid: str) -> Tuple[bool, str]: """ 测试模块 diff --git a/app/scheduler.py b/app/scheduler.py index 8b1afe84..2057d925 100644 --- a/app/scheduler.py +++ b/app/scheduler.py @@ -39,16 +39,21 @@ class Scheduler(metaclass=Singleton): 定时任务管理 """ # 定时服务 - _scheduler = BackgroundScheduler(timezone=settings.TZ, - executors={ - 'default': ThreadPoolExecutor(100) - }) + _scheduler = None # 退出事件 _event = threading.Event() # 锁 _lock = threading.Lock() + # 各服务的运行状态 + _jobs = {} def __init__(self): + self.init() + + def init(self): + """ + 初始化定时服务 + """ def clear_cache(): """ @@ -92,10 +97,19 @@ class Scheduler(metaclass=Singleton): } } + # 停止定时服务 + self.stop() + # 调试模式不启动定时服务 if settings.DEV: return + # 创建定时服务 + self._scheduler = BackgroundScheduler(timezone=settings.TZ, + executors={ + 'default': ThreadPoolExecutor(100) + }) + # CookieCloud定时同步 if settings.COOKIECLOUD_INTERVAL \ and str(settings.COOKIECLOUD_INTERVAL).isdigit(): @@ -385,6 +399,12 @@ class Scheduler(metaclass=Singleton): """ 关闭定时服务 """ - self._event.set() - if self._scheduler.running: - self._scheduler.shutdown() + try: + if self._scheduler: + self._event.set() + self._scheduler.remove_all_jobs() + if self._scheduler.running: + self._scheduler.shutdown() + self._scheduler = None + except Exception as e: + logger.error(f"停止定时任务失败::{str(e)} - {traceback.format_exc()}")