refactor: 优化启停逻辑

This commit is contained in:
jxxghp
2025-05-13 23:11:38 +08:00
parent 089ec36160
commit cf28e1d963
9 changed files with 97 additions and 56 deletions

View File

@@ -5,7 +5,6 @@ from sqlalchemy.orm import Session
from starlette.background import BackgroundTasks
from app import schemas
from app.api.endpoints.plugin import register_plugin_api
from app.chain.site import SiteChain
from app.chain.torrents import TorrentsChain
from app.command import Command
@@ -24,6 +23,7 @@ from app.helper.sites import SitesHelper
from app.scheduler import Scheduler
from app.schemas.types import SystemConfigKey, EventType
from app.utils.string import StringUtils
from startup.plugins_initializer import register_plugin_api
router = APIRouter()

View File

@@ -197,13 +197,13 @@ class ContentType(str, Enum):
操作状态的通知消息类型标识
"""
# 订阅添加成功
SubscribeAdded: str = "subscribeAdded"
SubscribeAdded = "subscribeAdded"
# 订阅完成
SubscribeComplete: str = "subscribeComplete"
SubscribeComplete = "subscribeComplete"
# 入库成功
OrganizeSuccess: str = "organizeSuccess"
OrganizeSuccess = "organizeSuccess"
# 下载开始(添加下载任务成功)
DownloadAdded: str = "downloadAdded"
DownloadAdded = "downloadAdded"
# 消息渠道

View File

@@ -0,0 +1,14 @@
from command import Command
def init_command():
"""
初始化命令
"""
Command()
def stop_command():
"""
停止命令
"""
pass

View File

@@ -4,9 +4,26 @@ from contextlib import asynccontextmanager
from fastapi import FastAPI
from app.startup.workflow_initializer import init_workflow, stop_workflow
from app.startup.modules_initializer import shutdown_modules, start_modules
from app.startup.plugins_initializer import init_plugins_async, stop_plugins
from app.startup.modules_initializer import init_modules, stop_modules
from app.startup.plugins_initializer import init_plugins, stop_plugins
from app.startup.routers_initializer import init_routers
from core.config import global_vars
from startup.command_initializer import init_command, stop_command
from startup.monitor_initializer import stop_monitor, init_monitor
from startup.scheduler_initializer import stop_scheduler, init_scheduler
async def init_extra_system():
"""
初始化额外的系统(依赖于插件初始化完成)
"""
await init_plugins()
# 启动监控器
init_monitor()
# 启动定时器
init_scheduler()
# 启动命令
init_command()
@asynccontextmanager
@@ -15,30 +32,37 @@ async def lifespan(app: FastAPI):
定义应用的生命周期事件
"""
print("Starting up...")
# 启动模块
start_modules(app)
# 初始化工作流动作
init_workflow(app)
# 初始化模块
init_modules()
# 初始化路由
init_routers(app)
# 初始化插件
plugin_init_task = asyncio.create_task(init_plugins_async())
# 初始化工作流
init_workflow()
# 初始化插件依赖系统
extra_init_task = asyncio.create_task(init_extra_system())
try:
# 在此处 yield表示应用已经启动控制权交回 FastAPI 主事件循环
yield
finally:
print("Shutting down...")
# 停止信号
global_vars.stop_system()
try:
# 取消插件初始化
plugin_init_task.cancel()
await plugin_init_task
extra_init_task.cancel()
await extra_init_task
except asyncio.CancelledError:
print("Plugin installation task cancelled.")
pass
except Exception as e:
print(f"Error during plugin installation shutdown: {e}")
# 清理模块
shutdown_modules(app)
# 关闭工作流
stop_workflow(app)
# 关闭插件
print(str(e))
# 停止插件
stop_plugins()
# 停止命令
stop_command()
# 停止监控器
stop_monitor()
# 停止定时器
stop_scheduler()
# 停止工作流
stop_workflow()
# 停止模块
stop_modules()

View File

@@ -1,12 +1,11 @@
import sys
from fastapi import FastAPI
from app.core.cache import close_cache
from app.core.config import global_vars, settings
from app.core.config import settings
from app.core.module import ModuleManager
from app.log import logger
from app.utils.system import SystemUtils
from command import CommandChain
# SitesHelper涉及资源包拉取提前引入并容错提示
try:
@@ -22,13 +21,10 @@ from app.helper.thread import ThreadHelper
from app.helper.display import DisplayHelper
from app.helper.resource import ResourceHelper
from app.helper.message import MessageHelper
from app.scheduler import Scheduler
from app.monitor import Monitor
from app.schemas import Notification, NotificationType
from app.schemas.types import SystemConfigKey
from app.db import close_database
from app.db.systemconfig_oper import SystemConfigOper
from app.command import Command, CommandChain
def start_frontend():
@@ -108,22 +104,16 @@ def check_auth():
)
def shutdown_modules(_: FastAPI):
def stop_modules():
"""
服务关闭
"""
# 停止信号
global_vars.stop_system()
# 停止模块
ModuleManager().stop()
# 停止事件消费
EventManager().stop()
# 停止虚拟显示
DisplayHelper().stop()
# 停止定时服务
Scheduler().stop()
# 停止监控
Monitor().stop()
# 停止线程池
ThreadHelper().shutdown()
# 停止缓存连接
@@ -136,7 +126,7 @@ def shutdown_modules(_: FastAPI):
clear_temp()
def start_modules(_: FastAPI):
def init_modules():
"""
启动模块
"""
@@ -152,12 +142,6 @@ def start_modules(_: FastAPI):
ModuleManager()
# 启动事件消费
EventManager().start()
# 启动监控任务
Monitor()
# 启动定时服务
Scheduler()
# 加载命令
Command()
# 启动前端服务
start_frontend()
# 检查认证状态

View File

@@ -0,0 +1,15 @@
from monitor import Monitor
def init_monitor():
"""
初始化监控器
"""
Monitor()
def stop_monitor():
"""
停止监控器
"""
Monitor().stop()

View File

@@ -1,20 +1,16 @@
import asyncio
from app.command import Command
from app.core.plugin import PluginManager
from app.log import logger
from app.scheduler import Scheduler
async def init_plugins_async():
async def init_plugins():
"""
初始化安装插件并动态注册后台任务及API
"""
try:
loop = asyncio.get_event_loop()
plugin_manager = PluginManager()
scheduler = Scheduler()
command = Command()
sync_result = await execute_task(loop, plugin_manager.sync, "插件同步到本地")
resolved_dependencies = await execute_task(loop, plugin_manager.install_plugin_missing_dependencies,
@@ -27,10 +23,6 @@ async def init_plugins_async():
logger.info("正在初始化所有插件")
# 安装完成后初始化插件
plugin_manager.start()
# 插件启动后注册后台任务
scheduler.init_plugin_jobs()
# 插件启动后注册菜单命令
command.init_commands()
# 插件启动后注册插件API
register_plugin_api()
logger.info("所有插件初始化完成")

View File

@@ -0,0 +1,14 @@
from scheduler import Scheduler
def init_scheduler():
"""
初始化定时器
"""
Scheduler()
def stop_scheduler():
"""
停止定时器
"""
Scheduler().stop()

View File

@@ -1,16 +1,14 @@
from fastapi import FastAPI
from app.core.workflow import WorkFlowManager
def init_workflow(_: FastAPI):
def init_workflow():
"""
初始化动作
"""
WorkFlowManager()
def stop_workflow(_: FastAPI):
def stop_workflow():
"""
停止动作
"""