最佳实践----状态机对多步骤异步操作建模

原创 2015年11月20日 22:41:13

在工作中,我们往往会遇到这样的问题,一个任务分为多个步骤,这几个步骤可能是连续的,也可能是可以跳转的,每个步骤都可能是异步的,

对于这样的问题,有没有一个通用的解决方案,或者是一个最佳实践呢,经过一些实践和推论我得出了一个最佳实践方案---》状态机。

推理如下,等待大家拍砖指点。

问题

首先将我们要讨论的问题进行简单建模,以四个子流程的异步任务为例, 核心处理流程如上图所示,4个需求:

1. 四个子流程,顺序执行。

2. 其中的每个步骤都可能是异步的。

3. 每个步骤都可能出错,出错之后跳到错误处理子流程

4. 执行的过程中如果出错,能够保存序列处理状态,下次启动之后从自动从该状态恢复。

以下就从这四个方面讨论不同实现的优劣。

问题建模

我们首先将抽离问题模型:一个任务T(task)S1S2S3S4(step)组成,如何对问题建模?


以下分步骤提出问题并以代码呈现的方式解决问题。

 

第一步满足需求1: 多个步骤顺序执行,如果是同步代码,我们往往会写成如下形式。


 


第二步满足需求2,3: 每个步骤都是异步的,且可能跳转到其他步骤。

 

在这里我们定义S1S2S3S4都是异步的,且若S1S2S3有任何一步失败,都会跳转到S4.

为了便于表达, 这里我把每个步骤增加一个返回值,作为是否跳转依据, 修改后的模型代码如下(Callback<Boolean>即返回Boolean类型的异步回调):


 

 

第三步满足需求4: 保存序列处理状态,并从中恢复。

我们再提出第三个需求,S1-S4的过程中可能进行到任何一个步骤系统退出,需要下一次重启之后继续从上一次的任务执行状态中恢复。

 

原来的异步代码依赖语言级闭包运行,无法从中间状态开始(比如越过S1,从S2->S4),但如果我们转换思想,将语言级的闭包变成自定义的局部上下文(状态机),一切迎刃而解,实现方案如下:

 

如上所述,当再遇到此类问题时,可首先套用该方案实施。

状态模式——State (更好的实现状态机)

From: http://chuanwang66.iteye.com/blog/1328563   1. 概述     The intent of the STATE pattern i...
  • hh2000
  • hh2000
  • 2014年12月07日 11:04
  • 731

有限状态机(FSM)的Java 演示

本文从简单的例子入手,逐步演变成非常复杂的程序。 在简明 状态模式(5.8)中,状态之间的变换由外界控制,或者说,多种状态是分割的、无关的。状态模式最有趣的地方正是讨论其状态的变迁。...
  • yqj2065
  • yqj2065
  • 2014年09月18日 14:51
  • 20100

使用C++实现一套简单的状态机模型——原理解析

本文解析了一种状态机模型实现的思路。
  • breaksoftware
  • breaksoftware
  • 2015年03月07日 22:40
  • 4152

【游戏设计模式】之三 状态模式、有限状态机 & Unity版本实现

游戏开发过程中,各种游戏状态的切换无处不在。但很多时候,简单粗暴的if else加标志位的方式并不能很地道地解决问题,这时,就可以运用到状态模式以及状态机来高效地完成任务。状态模式与状态机,因为他们关...
  • zhmxy555
  • zhmxy555
  • 2016年10月16日 20:04
  • 26873

Verilog中同步复位和异步复位比较

【Verilog】 同步复位和异步复位比较    同步复位 sync 异步复位 async 特点 复位信号只有在时钟上升沿到来时才能有效。 无论时钟沿是否到来,只要复...
  • kobesdu
  • kobesdu
  • 2013年11月16日 14:27
  • 14694

FPGA,verilog程序技巧之状态机与稳定性,高速

原因FPGA编程的稳定性,在程序编写到一定程度后,就会出现,这里是要提示的地方。...
  • my_share
  • my_share
  • 2014年06月05日 07:47
  • 3081

教材上的例子--有限状态机,四种建模方式

下图是教材中的例子,教材采用四种方法建模,具体随后道来: 方法一: (1)、建模 module fsm1(Clock,Reset,A,K1,K2);   input Clock...
  • Tina_yaoyao
  • Tina_yaoyao
  • 2015年04月19日 09:44
  • 614

基于模型的PLC程序设计三 层次状态机

这次我们再在前面的例子上加深一步,写个含有父状态的状态机,同时用ST语言描述。控制描述有一个电机,按下启动按钮后低速启动,按下加速按钮后切换成高速,按下减速按钮后再切换成低速,如果按停止按钮,直接停止...
  • dronghtom
  • dronghtom
  • 2017年05月19日 07:27
  • 787

Verilog中同步复位和异步复位比较

> 【Verilog】 同步复位和异步复位比较    同步复位 sync 异步复位 async 特点 复位信号只有在时钟上升沿到来时才能有效。 无论时钟沿是否到来,只要复位信号有效,就进行复位。 V...
  • chriscb
  • chriscb
  • 2017年08月11日 14:51
  • 136

FPGA中状态机的稳定性

第一个:状态机输出信号填写问题,下面是我转载的一些能百度的到的东西。好像都比较正常。这里我还要强调的是,每个状态机的输出信号都需要全面。 举例: always @ (posedge clk or ...
  • wordwarwordwar
  • wordwarwordwar
  • 2017年11月11日 23:26
  • 107
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最佳实践----状态机对多步骤异步操作建模
举报原因:
原因补充:

(最多只允许输入30个字)