跳转到: 导航, 搜索

NovaOrchestration/WorkflowEngines/SpiffWorkflow

SpiffWorkflow 说明

最近更新

2012-04-10:更新文档在此: https://github.com/knipknap/SpiffWorkflow/wiki

总结

SpiffWorkflow 是一个纯 Python 工作流框架,基于一些深入的学术研究,文档在此 http://www.workflowpatterns.com

代码可在 github 上找到。

自 2008 年年中创建以来,它似乎经历了三次活动高峰(其中一次是最近的,由我推动)。作者(Samuel,又名 knipknap)在 github 和 邮件列表 上都反应非常迅速

关于实现的文档主要在代码中,我们最近一直在添加。 SpiffWorkflow 背后的概念在 此处 有很好的文档记录。

代码干净(恕我直言),但需要更多的测试。

许可 
lGPLv2 https://github.com/knipknap/SpiffWorkflow/blob/master/COPYING
打包 
软件包列在 Python 软件包索引中,可以使用 pip 和 easy_install 安装 http://pypi.python.org/pypi/SpiffWorkflow/0.3.0
Python 版本 
我使用 Python 2.7 没有问题,也没有看到任何版本特定的内容。
文档 
http://github.com/knipknap/SpiffWorkflow]] 和 [[http://www.workflowpatterns.com

功能性

了解 SpiffWorkflow 的一个关键概念,有助于理解代码,是 TaskSpec 和 Task 以及 WorkflowSpec 和 Workflow 之间的区别。

使用 WorkflowSpecTaskSpec 来定义您的工作流。所有类型的任务(Join、Split、Execute、Wait 等)都源自 TaskSpec。可以使用 OpenWFE 等已知格式反序列化 Specs。您通过在树中连接 TaskSpecs 来构建您的 WorkflowSpec

当您想实际运行流程时,您从 WorkflowSpec 创建 Workflow 实例(将 spec 传递给 Workflow 初始化器)。

从那里的工作方式基于计算机编程的原理(请记住,该项目来自学术界)。基于 spec 创建一个派生树,使用 Task 对象层次结构(不是 TaskSpecs - 但每个 Task 指向生成它的 TaskSpec)。将派生树视为执行路径树(其中一些,但不是全部,最终会执行)。每个 Task 对象基本上是派生树中的一个节点。树中的每个任务都链接回其父级(没有连接对象)。通过一次向下遍历派生树中的一个 Task 并将任务(及其子任务)移动到完成状态序列来完成处理。状态在 代码 中记录

Workflow 和 Task 类位于项目的根目录中。所有 specs(TaskSpecWorkflowSpec 以及所有派生类)位于 specs 子目录中。

您可以序列化/反序列化 specs,并支持开放标准,如 OpenWFE(并且可以轻松地编写其他标准)。您还可以序列化/反序列化正在运行的工作流(它也会包含其 spec)。

另一个重要的区别在于属性和特性。属性属于 TaskSpecs。它们在运行时是静态的,属于工作流的设计。

有一个不错的事件模型,允许您绑定并接收事件(对于每个任务,您可以从其 TaskSpec 获取事件通知)。事件对应于派生树中的处理方式,不一定对应于工作流作为整体的移动方式。有关事件的文档,请参阅 TaskSpec.py

理解 FUTURE、WAITING、READY 和 COMPLETE 状态

  • FUTURE 表示处理器预测将采取此路径,并且此任务肯定会运行。
  • 如果任务正在等待前置任务运行,则处于 FUTURE 状态(不是 WAITING)。
  • READY 表示“满足了将此任务标记为完成的先决条件”。
  • 您可以随时尝试完成任务。如果它处于 FUTURE 状态并且未完成,则可以回退到 READY 状态。

Waiting 可能令人困惑

  • WAITING 表示“我正在处理我的工作并且尚未完成。工作完成后,我将 READY 完成并进入 READY 状态。”
  • WAITING 总是发生在 FUTURE 之后和 READY 之前。
  • WAITING 是一个可选状态。

除非您记住它表示处理器现在已在执行路径中到达此任务,否则“Reached”会令人困惑

  • REACHED 表示处理已到达派生树中的此任务。这不是一个状态,而是一个事件。
  • 任务总是先被到达,然后才变为 READY。

通用评论

您可以嵌套工作流(使用 SubWorkflowSpec)。

序列化代码完成得很好,这使得在需要支持它们时添加新格式变得容易。

需要更多的测试和文档,但该项目在我看来经过了深思熟虑并组织良好。我遇到的一些问题在与作者交谈后,结果发现得到了优雅的解决。

http://www.workflowpatterns.com 上的文档很棒;特别是显示每种任务如何工作的 Flash 动画。

标记为“ThreadXXXX”的任务基于 http://www.workflowpatterns.com 中的模型创建逻辑线程。没有实现 Python 线程。但是,有一些锁定和互斥代码。

有一个不错的事件模型,允许您绑定并接收事件。

没有 GUI 或工作流图形工具,但作者刚刚导入了一个 javascript 线框图库…