OpenStack公共组件oslo之十五——taskflow

        taskflow是oslo中用于为OpenStack项目和其他Python项目实现一个高可用的,易于理解的,声明式的执行工作、任务、流等的库。这个库让任务执行更加容易、一致和可靠。本文将详细介绍taskflow的实现原理与使用方式。

1 taskflow的实现原理

1.1 基本概念

        taskflow库在oslo项目中是一个实现比较复杂的项目,要弄清楚其实现原理,首先需要对其中的相关概念有所了解。所以,本文首先总结了taskflow中常用的一些基本概念,这些概念主要包括如下几个:

  • Atom:Atom类是taskflow的最小单位,taskflow中其他类,包括Task等都需要继承这个类。一个Atom对象是一个命名对象,通过操作输入数据以执行一些促进整个流程发展的动作,或者产生一个处理结果等。它是一个抽象类,提供了两个抽象方法:execute()用于执行一个动作,revert()用于根据execute()执行结果和失败信息还原到任务执行之前的状态;除此之外,还分别为这两个方法提供了pre_execute()/post_execute()、pre_revert()/post_revert()方法用于定义在执行execute或revert操作前后执行的操作。
  • Task:Task类是一个拥有执行和回滚操作的最小工作单元,表示一个任务流中的某一个任务。它是一个继承自Atom类的表示一个任务的父类,开发者可以执行定义一个继承自Task类的任务类,并重写execute()和revert()方法分别表示执行和回滚的操作。
  • Flow:Flow类是一个用来关联所有相关Task类,并规定这些Task类的执行和回滚顺序的抽象类。而oslo中为Flow提供了三种实现方式:graph_flow表示图流,linear_flow表示线性流,unordered_flow表示无序流。关于这三种类型的流实现会在之后进行详细分析。
  • Retry:Retry类也是一个继承自Atom的抽象类,它主要定义了当有错误发生时,如何进行重试操作。其也包含也不同的类型,将会在接下来的部分进行详细介绍。
  • Engine:Engine类是一个表示真正运行Atom对象的抽象类,它的实现类主要用于载入(load)一个Flow对象,然后驱动这个Flow对象的Task对象开始运行。Engine的实现也有多种不同的形式,这也会在接下来的部分进行详细介绍。
        以上的这些基本概念是理解和使用taskflow库的最重要的概念,当然在taskflow中还有一些其他的概念,在这里就不详细介绍了。接下来,将分别从这些基本概念展开介绍oslo项目中taskflow的实现原理。

1.2 Flow的类型

        在介绍taskflow的基本概念时说到Flow类分为三种类型,本小节将详细介绍oslo自定义的Flow的三种类型。oslo自定义的Flow的类型都放在taskflow.patterns包中,在这个包中,定义了三个模块:graph_flow、linear_flow和unordered_flow,在这三个模块中都定义了各自的Flow类。接下来,将分别介绍这三种类型:

  • linear_flow:线性流,该类型的Flow对象将按照Task/Flow加入的顺序来依次执行,按照加入的倒序依次回滚。
  • graph_flow:图流,该类型的Flow对象会按照给加入的Task/Flow显示指定的依赖关系或通过其间的provides/requires属性隐含的依赖关系执行和回滚。
  • unordered_flow:无序流,该类型的Flow对象所加入的Task/Flow会按照任意顺序执行或回滚。
        要弄清楚这三种类型的Flow对象,首先需要了解oslo定义的Flow基类的构成。在oslo定义的Flow基类中,主要包含以下几个重要的属性和方法:
  • name:表示初始化Flow对象时,为其指定的名称,并不能唯一表示一个Flow对象。
  • retry:表示与该Flow对象关联的重试控制器。
  • provides:表示该Flow对象提供的一组符号名称。
  • requires:表示该Flow对象所需要的一组"unsatisfied"符号名称。
  • add(*items):该方法用于为该Flow对象添加一个或一组Task/Flow对象。
  • iter_links():迭代Flow对象的子节点之间的依赖关系链接。例如在迭代一个三元组(A, B, meta)时,就是迭代一个从子节点A(一个Atom对象或一个Subflow)指向子节点B(一个Atom对象或一个Subflow)的链接;换句话说,也就代表了子流B依赖于子流A,或者子流B需要子流A;而meta代表了这个依赖关系链接的元数据,是一个字典。
  • iter_nodes():迭代Flow对象中的所有节点。例如在迭代一个二元组(A, meta)时,A(一个Atom对象或一个Subflow)是当前Flow对象的子流或子任务;meta同样代表了这个链接的元数据,是一个字典。
        以上所介绍的Flow类中的属性和方法都是实现taskflow执行和回滚顺序的关键。上文说到Flow类有三种实现,而在每一种实现的Flow类中,各实现类还定义了一个非常重要的属性:_graph,该属性代表了networkx.Graph类的一种实现。networkx是Python库中专门用于实现图和网络的库,对于这个库在这里我们不做过多介绍,感兴趣的朋友可以参考 networkx库官方文档。为了更好的实现taskflow所需要的图类型,oslo在taskflow.types.graph模块中重新实现了适合taskflow的图类型。重新定义的图类型如下所示:
  • Graph:一个拥有taskflow实用功能的networkx.Graph的子类,主要为taskflow中的图定义了一些工具方法,包括保持图不变形的freeze()方法,将图导出为点格式的export_to_dot()方法(依赖于pydot库),以及将图格式化为一个字符串的pformat()方法等。
  • DiGraph:一个拥有taskflow实用功能的networkx.Graph的子类,代表了一个有向图。
  • OrderedGraph:该类也是一个拥有taskflow实用功能的networkx.Graph的子类,但该类保留了节点、边、迭代顺序和插入顺序(以便迭代顺序可以匹配插入顺序)。
  • OrderedDiGraph:该类也是一个拥有taskflow实用功能的networkx.Graph的子类,代表的是一
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值