关于状态机工作流的编程方法

还没想好怎么写,先起了个古怪的名字。好吧,这篇文章纯属拔草之作,只讲一种大概的解决方案。

不过,我们大概得先解决掉两个概念:一个是状态机,一个是工作流。

什么是状态机?大概来说,就是我这里有一堆的状态,我在进行一项工作的时候,有一系列的状态;我要从一个状态转移到另一个状态。举个最简单的栗子:比如一个灯泡,有“开着”和“关着”两种状态。我对这个灯泡的操作是扳动开关,灯“开着”的时候,我按关灯,就到“关着”的状态;如果我再按开灯,就到了“开着”的状态。用状态转移图来表示大概是这样的:

什么是工作流?所谓工作流,就是有一定的步骤和顺序,需要按顺序进行的工作。假设在工作中,我们有一个研究课题,需要公司给予一定经费上的支持,但是公司也没法保证这个研究的可行性、是否符合公司的战略目标、是否合法、是否在公司的财务预算之内等等一系列问题,需要A、B、C、D四个人审批,A审批通过后交给B,B通过交给C,C通过交给D,D通过才算完全通过。如果有其中某一个不通过的,就要从头再来过。

那么状态机工作流就比较好理解了,就是把状态机和工作流结合在一起。还用上面那个审批的栗子,我们可以画出这样一个状态转移图:

OK,那么常规思路怎么做呢?

def approve():
    if A通过:
        if B通过:
            if C通过:
                if D通过:
                    return 通过
    return 不通过

用脚后跟想想也知道,这样是行不通的。如果A审批通过,B不在线,不能马上通过怎么办?开个线程阻塞掉?如果C审批完了,服务器突然宕机怎么办?前面的审批全都要重来一遍?我们这个审批流程已经是非常简单明确了,如果状态机再复杂一些……

对不起,代码不是这么堆的。

那么,我的思路是这样的:

既然最重要的是状态转移,那我们不妨把工作流中的每个状态保存起来,作为一个步骤。我们可以在数据库中单独增加一个表示状态的字段。比如,当状态为1的时候,表示“需要A审批”,状态为2的时候,表示“需要B审批”等等。表示审批的函数当然也很简单:

def approve():
    if agree:
        status += 1
    else:
        status = 0
    return status

接下来的工作,可能要看具体属于哪一类型的工作流。

如果是审批这种,当然再简单不过了,需要B审批了,我们就把数据库中状态为2的那些数据拿出来就好了。

有些类型不是靠前端展示的,而是后端执行的一系列动作,这样会复杂一些。如果对时间的要求不是特别高,可以用定时任务来处理。比如,我们把ABCD四个审批者换成ABCD四个环节,那么,我们每隔一段时间,选取数据库中尚未完成的任务,状态为1的任务进行A环节,状态为2的任务进行B环节,等等。

定时任务嘛,如果很简单,可以用schedule库,复杂一点的任务还是推荐celery——因为celery会给任务分配单独的任务队列和线程,操作起来比schedule要方便得多。而且需要定好大概得时间,以免任务太多,产生堆积。schedule我在之前的博文中介绍过,celery相对比较复杂,我现在也只会用其中的一部分。网上有比较完整的celery使用方法的文章,官网的介绍也是比较全面的,需要用到什么去查就好了。

原文地址:https://www.cnblogs.com/anpengapple/p/9746643.html

时间: 2024-10-08 12:19:13

关于状态机工作流的编程方法的相关文章

Workflow笔记2——状态机工作流(转)

出处:http://www.cnblogs.com/jiekzou/p/6192813.html 在上一节Workflow笔记1——工作流介绍中,介绍的是流程图工作流,后来微软又推出了状态机工作流,它比流程图功能更加强大. 状态机工作流:就是将工作流系统中的所有的工作节点都可以看做成一个状态节点.每个节点都有N个状态,其中都包含初始状态.进入状态.离开状态等.当节点的状态变化的时候会执行某个节点. 新建项目StatueWorkflowConsoleApp 自动添加了一个起始节点和一个状态节点.

SharePoint 2013 状态机工作流之日常报销示例

原文:SharePoint 2013 状态机工作流之日常报销示例 简单介绍下状态机工作流,状态机工作流提供了一系列的状态.工作流从初始状态开始,到终止状态结束.两个状态之间定义行为进行过渡.通常情况下,状态机工作流对事件作出反应,事件的发生将会使状态发生改变. 1.新建项目,选择SharePoint解决方案,创建空项目: 2.选择调试站点,部署为场解决方案,如下图: 3.添加新项,选择“Office/SharePoint”下面的“状态机工作流(仅场解决方案)”: 4.选择列表工作流,修改工作流名

SharePoint 2013 状态机工作流之UpdateItemActivity

原文:SharePoint 2013 状态机工作流之UpdateItemActivity 没什么可说的,一个Activity的使用介绍,其他类似的Activity也可以参考这个使用. 1.添加ApplyActivation和UpdateItemActivity,在onWorkflowActivated1节点的下面,setStateActivity1节点的上面,如下图: 2.配置ApplyActivation的_Context,新建字段,记得是字段,不是属性: 3.配置ApplyActivatio

SharePoint 2013 状态机工作流之扩展自定义状态

原文:SharePoint 2013 状态机工作流之扩展自定义状态 当我们使用SharePoint 2013的状态机工作流时,发现一个非常不爽的事情,就是SharePoint 所有的工作流状态,都是固定的那些,没办法显示我们自定义的状态,后来经过Google发现,原来这个状态是可以自定义的. 自定义状态步骤 1.  修改xml添加MetaData下面的扩展项: <ExtendedStatusColumnValues> <StatusColumnValue>测试状态1</Sta

编程方法心得体会

编程学习心得和方法(转载,供新手参考)   即便是高级编程人员,像那些为开发软件工作的类库和组件高手,他们也不敢说自己精通每一种语言. 事实就是这样,每一种语言有着它们相似而又不同的语法,它们有着不同的关键字,发展出了各种各样的类库,它们的函数或者方法的声明定义都有不同,更多的差异不为我们所知. 每一种语言,它都有着太多的东西需要我们去理解和记忆,我们没有时间和精力做得太多. 对于初学者,我们最不应该急于求成,更不要试图一次性学习所有语言.事实上,我们可以选取某种语言学习.每一种语言都有着自己的

状态机工作流

状态机工作流 状态机工作流通常用于模拟不能被预测人类行为时的事件流的一种替代方案,例如,在一个审批流程中,当事件驱动流程执行的过程,通常作为外部事件和导向转换, 通常作为外部事件和引导其他可能的状态之间的转换.状态机工作流的必须包括initial状态和 final 状态,用以表示该进程的启动和完成状态.这是一个灵活的逻辑流程,可以在工作流的状态间来回循环,因为外部事件驱动一个状态机工作流,他们在本质上是被动的. 这里面包含几个比较重要的基础元素 State Entry(进入状态),State E

iOS中有3种常见的多线程编程方法

1.NSThread 这种方法需要管理线程的生命周期.同步.加锁问题,会导致一定的性能开销 2.NSOperation和NSOperationQueue 是基于OC实现的.NSOperation以面向对象的方式封装了需要执行的操作,然后可以将这个操作放到一个NSOperationQueue中去异步执行.不必关心线程管理.同步等问题. 3.Grand Centeral Dispatch 简称GCD,iOS4才开始支持,是纯C语言的API.自iPad2开始,苹果设备开始有了双核CPU,为了充分利用这

多核并行编程方法

在多核的硬件结构中,如果要充分发挥硬件的性能,必须采用多线程(或多进程)执行,以提高CPU的利用率.多核系统的编程模型和多个CPU的SMP系统的编程模型是一致的,都属于共享存储的编程模型:同时,多核环境中也可以使用的分布式编程模型.目前,多核并行编程方法可以分为以下四类:基于Raw Thread API的方法.基于共享内存编程模型的方法.基于高层次模板库的方法.基于分布式编程的方法.(1)基于Raw Thread API的方法:这种方法主要使用系统底层API来进行多线程编程.Windows Th

功能间(两个form)数据交互的编程方法

功能间数据交互的编程方法 现在框架具有在两个打开的功能之间进行通讯的机制.通讯是指,一个功能调用另外一个功能的方法,或者传递一些数据,并得到返回结果.比如处置单打开结算单,结算单保存后,将结算单号反填到处置单上去.该机制通过委托实现两个功能之间方法的调用来通讯,支持同步和异步两种方式.框架隐藏了委托以及委托异步调用实现的复杂度. 一.实现机制示意图 两种调用方式:同步和异步.以下是两种调用的示意图.A为调用方,B为被调用方.也就是A功能调用B功能. 1,异步调用 2,  同步调用 二.编程 1,