feat:线上插件多线程加载

This commit is contained in:
jxxghp 2024-03-21 21:27:54 +08:00
parent ad0731e1ec
commit 761f1e7a4b

View File

@ -1,5 +1,7 @@
import concurrent
import concurrent.futures
import traceback import traceback
from typing import List, Any, Dict, Tuple from typing import List, Any, Dict, Tuple, Optional
from app.core.config import settings from app.core.config import settings
from app.core.event import eventmanager from app.core.event import eventmanager
@ -282,18 +284,15 @@ class PluginManager(metaclass=Singleton):
""" """
获取所有在线插件信息 获取所有在线插件信息
""" """
# 返回值 def __get_plugin_info(market: str) -> Optional[dict]:
all_confs = [] """
if not settings.PLUGIN_MARKET: 获取插件信息
return all_confs """
# 已安装插件
installed_apps = self.systemconfig.get(SystemConfigKey.UserInstalledPlugins) or []
# 线上插件列表
markets = settings.PLUGIN_MARKET.split(",")
for market in markets:
online_plugins = self.pluginhelper.get_plugins(market) or {} online_plugins = self.pluginhelper.get_plugins(market) or {}
if not online_plugins: if not online_plugins:
logger.warn(f"获取插件库失败 {market}") logger.warn(f"获取插件库失败:{market}")
return
ret_plugins = []
for pid, plugin in online_plugins.items(): for pid, plugin in online_plugins.items():
# 运行状插件 # 运行状插件
plugin_obj = self._running_plugins.get(pid) plugin_obj = self._running_plugins.get(pid)
@ -355,11 +354,28 @@ class PluginManager(metaclass=Singleton):
# 本地标志 # 本地标志
conf.update({"is_local": False}) conf.update({"is_local": False})
# 汇总 # 汇总
all_confs.append(conf) ret_plugins.append(conf)
return ret_plugins
if not settings.PLUGIN_MARKET:
return []
logger.info(f"开始获取第三方插件...")
# 返回值
all_plugins = []
# 已安装插件
installed_apps = self.systemconfig.get(SystemConfigKey.UserInstalledPlugins) or []
# 使用多线程获取线上插件
executor = concurrent.futures.ThreadPoolExecutor()
futures = []
for m in settings.PLUGIN_MARKET.split(","):
futures.append(executor.submit(__get_plugin_info, m))
for future in concurrent.futures.as_completed(futures):
plugins = future.result()
if plugins:
all_plugins.extend(plugins)
logger.info(f"共获取到 {len(all_plugins)} 个第三方插件")
# 按插件ID去重 # 按插件ID去重
if all_confs: return list({v["id"]: v for v in all_plugins}.values())
all_confs = list({v["id"]: v for v in all_confs}.values())
return all_confs
def get_local_plugins(self) -> List[dict]: def get_local_plugins(self) -> List[dict]:
""" """