您的位置:首页 > 其它

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

2009-02-01 22:30 579 查看
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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: