feat(setup): support asynchronous install plugins on startup

This commit is contained in:
InfinityPacer
2024-10-17 09:37:51 +08:00
parent 4469a1b3b8
commit bcc48e885a
7 changed files with 119 additions and 37 deletions

View File

@@ -1,9 +1,11 @@
import asyncio
from contextlib import asynccontextmanager
from fastapi import FastAPI
from app.startup.module_initializer import start_modules, shutdown_modules
from app.startup.routers import init_routers
from app.startup.modules_initializer import shutdown_modules, start_modules
from app.startup.plugins_initializer import init_plugins_async
from app.startup.routers_initializer import init_routers
@asynccontextmanager
@@ -14,6 +16,16 @@ async def lifespan(app: FastAPI):
print("Starting up...")
start_modules(app)
init_routers(app)
yield
print("Shutting down...")
shutdown_modules(app)
plugin_init_task = asyncio.create_task(init_plugins_async())
try:
yield
finally:
print("Shutting down...")
try:
plugin_init_task.cancel()
await plugin_init_task
except asyncio.CancelledError:
print("Plugin installation task cancelled.")
except Exception as e:
print(f"Error during plugin installation shutdown: {e}")
shutdown_modules(app)

View File

@@ -147,8 +147,6 @@ def start_modules(_: FastAPI):
ModuleManager()
# 启动事件消费
EventManager().start()
# 安装在线插件
PluginManager().sync()
# 加载插件
PluginManager().start()
# 启动监控任务

View File

@@ -0,0 +1,37 @@
import asyncio
from app.core.plugin import PluginManager
from app.log import logger
from app.scheduler import Scheduler
async def init_plugins_async():
"""
初始化安装插件并动态注册后台任务及API
"""
try:
loop = asyncio.get_event_loop()
plugin_manager = PluginManager()
scheduler = Scheduler()
sync_plugins = await loop.run_in_executor(None, plugin_manager.sync)
if not sync_plugins:
return
# 为避免初始化插件异常,这里所有插件都进行初始化
logger.info(f"已同步安装 {len(sync_plugins)} 个在线插件,正在初始化所有插件")
# 安装完成后重新初始化插件
plugin_manager.init_config()
# 插件启动后注册后台任务
scheduler.init_plugin_jobs()
# 插件启动后注册插件API
register_plugin_api()
logger.info("所有插件初始化完成")
except Exception as e:
logger.error(f"插件初始化过程中出现异常: {e}")
def register_plugin_api():
"""
插件启动后注册插件API
"""
from app.api.endpoints import plugin
plugin.register_plugin_api()