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 背后的概念在 此处 有很好的文档记录。
代码干净(恕我直言),但需要更多的测试。
- 打包
- 软件包列在 Python 软件包索引中,可以使用 pip 和 easy_install 安装 http://pypi.python.org/pypi/SpiffWorkflow/0.3.0。
- Python 版本
- 我使用 Python 2.7 没有问题,也没有看到任何版本特定的内容。
功能性
了解 SpiffWorkflow 的一个关键概念,有助于理解代码,是 TaskSpec 和 Task 以及 WorkflowSpec 和 Workflow 之间的区别。
使用 WorkflowSpec 和 TaskSpec 来定义您的工作流。所有类型的任务(Join、Split、Execute、Wait 等)都源自 TaskSpec。可以使用 OpenWFE 等已知格式反序列化 Specs。您通过在树中连接 TaskSpecs 来构建您的 WorkflowSpec。
当您想实际运行流程时,您从 WorkflowSpec 创建 Workflow 实例(将 spec 传递给 Workflow 初始化器)。
从那里的工作方式基于计算机编程的原理(请记住,该项目来自学术界)。基于 spec 创建一个派生树,使用 Task 对象层次结构(不是 TaskSpecs - 但每个 Task 指向生成它的 TaskSpec)。将派生树视为执行路径树(其中一些,但不是全部,最终会执行)。每个 Task 对象基本上是派生树中的一个节点。树中的每个任务都链接回其父级(没有连接对象)。通过一次向下遍历派生树中的一个 Task 并将任务(及其子任务)移动到完成状态序列来完成处理。状态在 代码 中记录
Workflow 和 Task 类位于项目的根目录中。所有 specs(TaskSpec、WorkflowSpec 以及所有派生类)位于 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 线框图库…