还没想好怎么写,先起了个古怪的名字。好吧,这篇文章纯属拔草之做,只讲一种大概的解决方案。
不过,咱们大概得先解决掉两个概念:一个是状态机,一个是工做流。
什么是状态机?大概来讲,就是我这里有一堆的状态,我在进行一项工做的时候,有一系列的状态;我要从一个状态转移到另外一个状态。举个最简单的栗子:好比一个灯泡,有“开着”和“关着”两种状态。我对这个灯泡的操做是扳动开关,灯“开着”的时候,我按关灯,就到“关着”的状态;若是我再按开灯,就到了“开着”的状态。用状态转移图来表示大概是这样的:
什么是工做流?所谓工做流,就是有必定的步骤和顺序,须要按顺序进行的工做。假设在工做中,咱们有一个研究课题,须要公司给予必定经费上的支持,可是公司也无法保证这个研究的可行性、是否符合公司的战略目标、是否合法、是否在公司的财务预算以内等等一系列问题,须要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使用方法的文章,官网的介绍也是比较全面的,须要用到什么去查就行了。