stevedore簡介

聲明:

本博客歡迎轉發,但請保留原作者信息!

新浪微博:@孔令賢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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章