mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-04-27 12:12:24 +08:00
refactor: 优化启停逻辑
This commit is contained in:
@@ -5,7 +5,6 @@ from sqlalchemy.orm import Session
|
|||||||
from starlette.background import BackgroundTasks
|
from starlette.background import BackgroundTasks
|
||||||
|
|
||||||
from app import schemas
|
from app import schemas
|
||||||
from app.api.endpoints.plugin import register_plugin_api
|
|
||||||
from app.chain.site import SiteChain
|
from app.chain.site import SiteChain
|
||||||
from app.chain.torrents import TorrentsChain
|
from app.chain.torrents import TorrentsChain
|
||||||
from app.command import Command
|
from app.command import Command
|
||||||
@@ -24,6 +23,7 @@ from app.helper.sites import SitesHelper
|
|||||||
from app.scheduler import Scheduler
|
from app.scheduler import Scheduler
|
||||||
from app.schemas.types import SystemConfigKey, EventType
|
from app.schemas.types import SystemConfigKey, EventType
|
||||||
from app.utils.string import StringUtils
|
from app.utils.string import StringUtils
|
||||||
|
from startup.plugins_initializer import register_plugin_api
|
||||||
|
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|
||||||
|
|
||||||
# 消息渠道
|
# 消息渠道
|
||||||
|
|||||||
14
app/startup/command_initializer.py
Normal file
14
app/startup/command_initializer.py
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
from command import Command
|
||||||
|
|
||||||
|
|
||||||
|
def init_command():
|
||||||
|
"""
|
||||||
|
初始化命令
|
||||||
|
"""
|
||||||
|
Command()
|
||||||
|
|
||||||
|
def stop_command():
|
||||||
|
"""
|
||||||
|
停止命令
|
||||||
|
"""
|
||||||
|
pass
|
||||||
@@ -4,9 +4,26 @@ from contextlib import asynccontextmanager
|
|||||||
from fastapi import FastAPI
|
from fastapi import FastAPI
|
||||||
|
|
||||||
from app.startup.workflow_initializer import init_workflow, stop_workflow
|
from app.startup.workflow_initializer import init_workflow, stop_workflow
|
||||||
from app.startup.modules_initializer import shutdown_modules, start_modules
|
from app.startup.modules_initializer import init_modules, stop_modules
|
||||||
from app.startup.plugins_initializer import init_plugins_async, stop_plugins
|
from app.startup.plugins_initializer import init_plugins, stop_plugins
|
||||||
from app.startup.routers_initializer import init_routers
|
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
|
@asynccontextmanager
|
||||||
@@ -15,30 +32,37 @@ async def lifespan(app: FastAPI):
|
|||||||
定义应用的生命周期事件
|
定义应用的生命周期事件
|
||||||
"""
|
"""
|
||||||
print("Starting up...")
|
print("Starting up...")
|
||||||
# 启动模块
|
# 初始化模块
|
||||||
start_modules(app)
|
init_modules()
|
||||||
# 初始化工作流动作
|
|
||||||
init_workflow(app)
|
|
||||||
# 初始化路由
|
# 初始化路由
|
||||||
init_routers(app)
|
init_routers(app)
|
||||||
# 初始化插件
|
# 初始化工作流
|
||||||
plugin_init_task = asyncio.create_task(init_plugins_async())
|
init_workflow()
|
||||||
|
# 初始化插件依赖系统
|
||||||
|
extra_init_task = asyncio.create_task(init_extra_system())
|
||||||
try:
|
try:
|
||||||
# 在此处 yield,表示应用已经启动,控制权交回 FastAPI 主事件循环
|
# 在此处 yield,表示应用已经启动,控制权交回 FastAPI 主事件循环
|
||||||
yield
|
yield
|
||||||
finally:
|
finally:
|
||||||
print("Shutting down...")
|
print("Shutting down...")
|
||||||
|
# 停止信号
|
||||||
|
global_vars.stop_system()
|
||||||
try:
|
try:
|
||||||
# 取消插件初始化
|
extra_init_task.cancel()
|
||||||
plugin_init_task.cancel()
|
await extra_init_task
|
||||||
await plugin_init_task
|
|
||||||
except asyncio.CancelledError:
|
except asyncio.CancelledError:
|
||||||
print("Plugin installation task cancelled.")
|
pass
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error during plugin installation shutdown: {e}")
|
print(str(e))
|
||||||
# 清理模块
|
# 停止插件
|
||||||
shutdown_modules(app)
|
|
||||||
# 关闭工作流
|
|
||||||
stop_workflow(app)
|
|
||||||
# 关闭插件
|
|
||||||
stop_plugins()
|
stop_plugins()
|
||||||
|
# 停止命令
|
||||||
|
stop_command()
|
||||||
|
# 停止监控器
|
||||||
|
stop_monitor()
|
||||||
|
# 停止定时器
|
||||||
|
stop_scheduler()
|
||||||
|
# 停止工作流
|
||||||
|
stop_workflow()
|
||||||
|
# 停止模块
|
||||||
|
stop_modules()
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
from fastapi import FastAPI
|
|
||||||
|
|
||||||
from app.core.cache import close_cache
|
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.core.module import ModuleManager
|
||||||
from app.log import logger
|
from app.log import logger
|
||||||
from app.utils.system import SystemUtils
|
from app.utils.system import SystemUtils
|
||||||
|
from command import CommandChain
|
||||||
|
|
||||||
# SitesHelper涉及资源包拉取,提前引入并容错提示
|
# SitesHelper涉及资源包拉取,提前引入并容错提示
|
||||||
try:
|
try:
|
||||||
@@ -22,13 +21,10 @@ from app.helper.thread import ThreadHelper
|
|||||||
from app.helper.display import DisplayHelper
|
from app.helper.display import DisplayHelper
|
||||||
from app.helper.resource import ResourceHelper
|
from app.helper.resource import ResourceHelper
|
||||||
from app.helper.message import MessageHelper
|
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 import Notification, NotificationType
|
||||||
from app.schemas.types import SystemConfigKey
|
from app.schemas.types import SystemConfigKey
|
||||||
from app.db import close_database
|
from app.db import close_database
|
||||||
from app.db.systemconfig_oper import SystemConfigOper
|
from app.db.systemconfig_oper import SystemConfigOper
|
||||||
from app.command import Command, CommandChain
|
|
||||||
|
|
||||||
|
|
||||||
def start_frontend():
|
def start_frontend():
|
||||||
@@ -108,22 +104,16 @@ def check_auth():
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def shutdown_modules(_: FastAPI):
|
def stop_modules():
|
||||||
"""
|
"""
|
||||||
服务关闭
|
服务关闭
|
||||||
"""
|
"""
|
||||||
# 停止信号
|
|
||||||
global_vars.stop_system()
|
|
||||||
# 停止模块
|
# 停止模块
|
||||||
ModuleManager().stop()
|
ModuleManager().stop()
|
||||||
# 停止事件消费
|
# 停止事件消费
|
||||||
EventManager().stop()
|
EventManager().stop()
|
||||||
# 停止虚拟显示
|
# 停止虚拟显示
|
||||||
DisplayHelper().stop()
|
DisplayHelper().stop()
|
||||||
# 停止定时服务
|
|
||||||
Scheduler().stop()
|
|
||||||
# 停止监控
|
|
||||||
Monitor().stop()
|
|
||||||
# 停止线程池
|
# 停止线程池
|
||||||
ThreadHelper().shutdown()
|
ThreadHelper().shutdown()
|
||||||
# 停止缓存连接
|
# 停止缓存连接
|
||||||
@@ -136,7 +126,7 @@ def shutdown_modules(_: FastAPI):
|
|||||||
clear_temp()
|
clear_temp()
|
||||||
|
|
||||||
|
|
||||||
def start_modules(_: FastAPI):
|
def init_modules():
|
||||||
"""
|
"""
|
||||||
启动模块
|
启动模块
|
||||||
"""
|
"""
|
||||||
@@ -152,12 +142,6 @@ def start_modules(_: FastAPI):
|
|||||||
ModuleManager()
|
ModuleManager()
|
||||||
# 启动事件消费
|
# 启动事件消费
|
||||||
EventManager().start()
|
EventManager().start()
|
||||||
# 启动监控任务
|
|
||||||
Monitor()
|
|
||||||
# 启动定时服务
|
|
||||||
Scheduler()
|
|
||||||
# 加载命令
|
|
||||||
Command()
|
|
||||||
# 启动前端服务
|
# 启动前端服务
|
||||||
start_frontend()
|
start_frontend()
|
||||||
# 检查认证状态
|
# 检查认证状态
|
||||||
|
|||||||
15
app/startup/monitor_initializer.py
Normal file
15
app/startup/monitor_initializer.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
from monitor import Monitor
|
||||||
|
|
||||||
|
|
||||||
|
def init_monitor():
|
||||||
|
"""
|
||||||
|
初始化监控器
|
||||||
|
"""
|
||||||
|
Monitor()
|
||||||
|
|
||||||
|
|
||||||
|
def stop_monitor():
|
||||||
|
"""
|
||||||
|
停止监控器
|
||||||
|
"""
|
||||||
|
Monitor().stop()
|
||||||
@@ -1,20 +1,16 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
|
|
||||||
from app.command import Command
|
|
||||||
from app.core.plugin import PluginManager
|
from app.core.plugin import PluginManager
|
||||||
from app.log import logger
|
from app.log import logger
|
||||||
from app.scheduler import Scheduler
|
|
||||||
|
|
||||||
|
|
||||||
async def init_plugins_async():
|
async def init_plugins():
|
||||||
"""
|
"""
|
||||||
初始化安装插件,并动态注册后台任务及API
|
初始化安装插件,并动态注册后台任务及API
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_event_loop()
|
||||||
plugin_manager = PluginManager()
|
plugin_manager = PluginManager()
|
||||||
scheduler = Scheduler()
|
|
||||||
command = Command()
|
|
||||||
|
|
||||||
sync_result = await execute_task(loop, plugin_manager.sync, "插件同步到本地")
|
sync_result = await execute_task(loop, plugin_manager.sync, "插件同步到本地")
|
||||||
resolved_dependencies = await execute_task(loop, plugin_manager.install_plugin_missing_dependencies,
|
resolved_dependencies = await execute_task(loop, plugin_manager.install_plugin_missing_dependencies,
|
||||||
@@ -27,10 +23,6 @@ async def init_plugins_async():
|
|||||||
logger.info("正在初始化所有插件")
|
logger.info("正在初始化所有插件")
|
||||||
# 安装完成后初始化插件
|
# 安装完成后初始化插件
|
||||||
plugin_manager.start()
|
plugin_manager.start()
|
||||||
# 插件启动后注册后台任务
|
|
||||||
scheduler.init_plugin_jobs()
|
|
||||||
# 插件启动后注册菜单命令
|
|
||||||
command.init_commands()
|
|
||||||
# 插件启动后注册插件API
|
# 插件启动后注册插件API
|
||||||
register_plugin_api()
|
register_plugin_api()
|
||||||
logger.info("所有插件初始化完成")
|
logger.info("所有插件初始化完成")
|
||||||
|
|||||||
14
app/startup/scheduler_initializer.py
Normal file
14
app/startup/scheduler_initializer.py
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
from scheduler import Scheduler
|
||||||
|
|
||||||
|
|
||||||
|
def init_scheduler():
|
||||||
|
"""
|
||||||
|
初始化定时器
|
||||||
|
"""
|
||||||
|
Scheduler()
|
||||||
|
|
||||||
|
def stop_scheduler():
|
||||||
|
"""
|
||||||
|
停止定时器
|
||||||
|
"""
|
||||||
|
Scheduler().stop()
|
||||||
@@ -1,16 +1,14 @@
|
|||||||
from fastapi import FastAPI
|
|
||||||
|
|
||||||
from app.core.workflow import WorkFlowManager
|
from app.core.workflow import WorkFlowManager
|
||||||
|
|
||||||
|
|
||||||
def init_workflow(_: FastAPI):
|
def init_workflow():
|
||||||
"""
|
"""
|
||||||
初始化动作
|
初始化动作
|
||||||
"""
|
"""
|
||||||
WorkFlowManager()
|
WorkFlowManager()
|
||||||
|
|
||||||
|
|
||||||
def stop_workflow(_: FastAPI):
|
def stop_workflow():
|
||||||
"""
|
"""
|
||||||
停止动作
|
停止动作
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user