stevedore简介

来源:互联网 发布:单例模式php 编辑:程序博客网 时间:2024/06/01 09:37

声明:

本博客欢迎转发,但请保留原作者信息!

新浪微博:@孔令贤HW

博客地址:http://blog.csdn.net/lynn_kong

内容系本人学习、研究和总结,如有雷同,实属荣幸!


stevedore基于setuptools entry point(http://packages.python.org/distribute/pkg_resources.html#convenience-api),提供python应用程序管理插件的功能。

 

一、插件的几种使用方式

1、Drivers – Single Name, Single Entry Point

即一种插件对应一种外部资源(数据库,设备或远程应用程序),同一类资源可能有很多不同的插件,使用时对于某一个特定的资源只能选择其中一种。


使用示例:

SQLAlchemy(http://sqlalchemy.org/)

libcloud(http://libcloud.apache.org/)

 

2、Hooks – Single Name, Many Entry Points

这种使用的方式,类似于,一个应用程序触发了一个事件,需要不同的程序进行处理,同一个namespace中,不同的entrypoint可以使用相同的名称。


使用示例:

Emacs mode hook functions(http://www.gnu.org/software/emacs/manual/html_node/emacs/Hooks.html)

Django signals(https://docs.djangoproject.com/en/dev/topics/signals/)

 

3、Extensions – Many Names, Many Entry Points

一种更加通用的使用方式。

 

二、stevedore中的类

1、Extension(name, entry_point, plugin, obj)

表示一个entry point,所有传递的参数都作为对象的属性。

name: entry point的名称;

entry_point: 从pkg_resources获得的表示entrypoint的EntryPoint对象;

plugin: entry_point.load()返回的类;

obj: extension被加载时会触发plugin(*args, **kwds),创建一个plugin的实例;

 

2、ExtensionManager(namespace, invoke_on_load=False, invoke_args=(),invoke_kwds={}, propagate_map_exceptions=False)

其他所有manager的基类,参数说明: 

namespace (str) –entry points的命名空间.

invoke_on_load (bool) – 是否自动加载extension.

invoke_args (tuple) – 自动加载extension时向实例传递的参数1.

invoke_kwds (dict) – 自动加载extension实例时传递的参数2.

propagate_map_exceptions – 使用map调用时,是否向上传递异常信息.

 

方法:

map(func, *args, **kwds)

对每一个extension触发func调用,func的写法:

def func(ext, *args, **kwds):

    pass

 

names()

返回extension的名称列表

 

3、EnabledExtensionManager(namespace, check_func, invoke_on_load=False,invoke_args=(), invoke_kwds={}, propagate_map_exceptions=False)

继承自ExtensionManager,只加载通过check_func校验的extension

 

4、DispatchExtensionManager(namespace, check_func,invoke_on_load=False, invoke_args=(), invoke_kwds={},propagate_map_exceptions=False)

继承自EnabledExtensionManager,扩展了map函数

map(filter_func, func, *args, **kwds)

filter_func与func写法一样,只有通过filter_func的extension,才执行func调用。

 

5、NameDispatchExtensionManager(namespace, check_func,invoke_on_load=False, invoke_args=(), invoke_kwds={},propagate_map_exceptions=False)

继承自DispatchExtensionManager,修改了map函数

map(names, func, *args, **kwds)

只有名称在names中的extension,才执行func调用。

 

6、NamedExtensionManager (namespace, names, invoke_on_load=False,invoke_args=(), invoke_kwds={}, name_order=False,propagate_map_exceptions=False)

继承自ExtensionManager,只加载名称在names内的extension。

 

7、HookManager(namespace, name, invoke_on_load=False, invoke_args=(),invoke_kwds={})

继承自NamedExtensionManager,加载相同的名称的extensions

 

8、DriverManager(namespace, name, invoke_on_load=False, invoke_args=(),invoke_kwds={})

继承自NamedExtensionManager,加载名称等于name的一个extension。

__call__(func, *args, **kwds)

driver:返回driver对象


关系图:



三、stevedore的使用

详见:http://stevedore.readthedocs.org/en/latest/tutorial/index.html



原创粉丝点击