本文主要是介绍Python插件技术知识,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
背景概述
- 插件化机制使框架与各个模块的实现相解耦,模块统一抽象出基本数据结构与框架的交互接口,模块只要符合统一接口即可做到插件替换。
架构图
- PluginCore:通过Plugin Manager调用算法,负责业务逻辑的实现
- PluginManger: 通过读取配置文件,负责各种插件的加载、管理、甚至热更新
插件实现
import()函数
- 用于动态加载类和函数。如果一个模块经常变化就可以使用 import() 来动态载入
- 函数语法:
__import__(name, globals=None, locals=None, fromlist=(), level=0)
name[必须]:模块名称
globals - 全局变量集合,默认为None
locals - 局部变量集合,默认为None
fromlist - 是否导入子模块,看上去是导入模块的列表。但实际是一个判断条件,只要设置为非空的值,且模块名称是带有子模块的,将导入子模块。例如:sys.path。当不设置时,返回sys,如果设置为非空值,则返回ntpath(path模块)
level - 绝对或者相对导入
加载方式
- 直接引用加载【老版】
- Importlib包方式【新版】
算法插件服务
插件定义
- 每个插件需要实现公共数据接口和接口方法。
load_model(self, root_path, batch_size=1, devs=None):
:模型加载入口
predict(self, req_dict={}):
:推理算法入口
version(self):
:版本方法
配置化管理
- 插件通过配置文件组织可选插件以及 插件名 、插件路径 等信息。
key:配置插件模块的名字
key: str,
model_dir:配置插件内部方法名字
model_dir : str,
infer_dir:配置插件具体加载路径(工程下绝对路径)
infer_dir : str,
插件管理器
- 定义了插件管理的方法,插件功能加载、插件获取方法实现
_load_plugin(self, name, dir)
:插件加载入口,识别配置加载插件
get_plugin(self, name):
:插件获取接口,该方法获取插件
插件扩展
插件热加载
- Importlib.reload方法实现
插件优势
- 高可扩展:开发者可自由实现符合业务需求的模块插件,直接替换插件配置就可以实现业务扩展
- 发布灵活:插件可集中发布也可单独发布,配合插件生命周期管理甚至可以实现插件的单独更新
- 代码解耦:各个插件模块开发和部署都单独进行,能方便的扩展和自由实现符合业务需求的插件
微内核架构
- 微内核架构是插件架构模式的一种典型实现,常常把微内核架构也叫做插件式架构
- 当前微内核架构也被应用在许多我们熟知的产品,比如:操作系统、Chrome浏览器、Eclipse编辑器等
架构图
- 微内核架构包含两个组件:核心系统(core system)和插件模块(plug-in component)
- 核心系统只包含让系统可以运作的最小功能
- 插件模块,则包含一些特殊处理逻辑、额外的功能,用于提供更多的业务能力
That’s all!
这篇关于Python插件技术知识的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!