Erlang には有限ステートマシンを実装するための、gen_fsm
が用意されている。
要点まとめ
- gen_server の「状態」とは、どういう変更が加えられてきたか、という累積的なもの。
- gen_fsm の「状態」とは、FSMがいまどのステート(状態)にいるか、ということを表す。
- ステートによって決まるものは、あるイベントが送られてきた際のコンテキスト。
- ステートとは、関数。
- あるイベントがステートへ送られるとは、ある引数(イベント)で関数(ステート)を実行するということ
- つまり、
イベントが送られた際のコンテキスト
というのは、どの関数(ステート)その引数(イベント)を待ち受けているのか?ということを表す。
- ステートによって決まるものは、あるイベントが送られてきた際のコンテキスト。
gen_fsm の概要図
状態(ステート) とは
-
StateName
とは、ある状態(ステート)を表すプレースホルダ(変数名のような感じ)- ステートは関数。
- ステートを実行し、別のステート(StateName) へ遷移したり、しなかったりする。
- ステートは関数。
- StateName/2 は非同期イベントを処理する
- 引数は Event(イベントとして遅れらてきた実際にメッセージ) と StateData(呼び出し先に渡されたデータ)
- StateName/3 は同期イベントを処理する
- 引数は Event, From, StateData
グローバルなステート
- 現在の状態(ステート)に関係なく実行されるもの
- handle_event は非同期のグローバルイベントを処理する
- handle_sync_event は同期のグローバルイベントを処理する
イベントの判断
あるイベントがグローバルイベントなのか、特定の状態に対してなのか、は呼び出す関数で判断する。
StateName(通常のステート) へは
- gen_fsm:send_event/2 で非同期イベント
- gen_fsm:send_event/2-3 で同期イベント よって send_event が使われていたらある StateName の関数へイベントが送られる。
handle_event, handle_sync_event、つまりグローバルイベントへは
- gen_fsm:send_all_state_event/2 同期
- gen_fsm:sync_send_all_state_event/2-3 非同期