面对软件错误构建可靠的分布式系统_笔记12

6.4通用有限状态机Finite State Machine
 gen_fsm
 某个状态发生了事件后,应当执行某个操作,状态更新
StateName(Evnet, StateData) ->
    {next_state, StateNameNew, StateDataNew}.


6.4.1通用有限状态机API
有限的几个状态,不同事件发生后,进入不同的状态。类似通道门的开闭
(1)gen_fsm:start(Name1,Mod, Arg, Options) -> Result
    启动,参数见前
(2)gen_fms:send_event(Name1, Event) -> ok
    发送一个事件给Name1
(3)Mod:init(Arg) -> {ok, StateName, StateData}.
    初始化
(4)Mod:StateName(Event, SData) -> {nextstate, SName1, SData1}.
启动时gen_fsm:start() -> Mod:init() 返回StateName和StateData
改变状态时:gen_fsm:send_event() -> Mod:StateName)
eg:
-module(thesis_assember).
-behaviour(gen_fsm).

-export([start/0, init/1, terminate/3]).
-export([waiting/2, collecting/2,send_header/1, send_data/1]).
-define(NAME, my_simple_packet_assembler).
%% waiting and collecting,two states

start() ->
 gen_fsm:start_link({local, ?NAME}, ?MODULE, arg1, []).

send_header(Len) -> gen_fsm:send_event(?NAME, Len).
send_data(Str) -> gen_fsm:send_event(?NAME, Str).

init(arg1) ->
 io:format("Packet assembler starting~n"),
 {ok, waiting, nil}.
waiting(N, nil) ->
 {next_state, collecting, {N,0,[]}}.
collecting(Buff0, {Need, Len, Buff1}) ->
 L = length(Buff0),
 if
  L + Len < Need ->
   {next_state, collecting, {Need, Len+L,Buff1++Buff0}};
  L + Len >= Need ->
   Buff = Buff1 ++ Buff0,
   io:format("Got data:~s~n",[Buff]),
   {next_state, waiting, nil}
 end.
  
terminate(Reason, State, Data) ->
     io:format("packet assembler terminate ~p ~n",[Reason]),
     true.

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值