From 761f1e7a4b511880b85641e05785624a8431a931 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Thu, 21 Mar 2024 21:27:54 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E7=BA=BF=E4=B8=8A=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=A4=9A=E7=BA=BF=E7=A8=8B=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/plugin.py | 46 +++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/app/core/plugin.py b/app/core/plugin.py index 8e4aa2d3..7c697146 100644 --- a/app/core/plugin.py +++ b/app/core/plugin.py @@ -1,5 +1,7 @@ +import concurrent +import concurrent.futures 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.event import eventmanager @@ -282,18 +284,15 @@ class PluginManager(metaclass=Singleton): """ 获取所有在线插件信息 """ - # 返回值 - 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: + def __get_plugin_info(market: str) -> Optional[dict]: + """ + 获取插件信息 + """ online_plugins = self.pluginhelper.get_plugins(market) or {} if not online_plugins: - logger.warn(f"获取插件库失败 {market}") + logger.warn(f"获取插件库失败:{market}") + return + ret_plugins = [] for pid, plugin in online_plugins.items(): # 运行状插件 plugin_obj = self._running_plugins.get(pid) @@ -355,11 +354,28 @@ class PluginManager(metaclass=Singleton): # 本地标志 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去重 - if all_confs: - all_confs = list({v["id"]: v for v in all_confs}.values()) - return all_confs + return list({v["id"]: v for v in all_plugins}.values()) def get_local_plugins(self) -> List[dict]: """