LoginSignup
1
2

More than 5 years have passed since last update.

すごいErlangゆかいに学んだメモ第15章 レイジ・アゲインスト・ザ・有限ステート・マシーン

Posted at

Erlang には有限ステートマシンを実装するための、gen_fsm が用意されている。

要点まとめ

  • gen_server の「状態」とは、どういう変更が加えられてきたか、という累積的なもの。
  • gen_fsm の「状態」とは、FSMがいまどのステート(状態)にいるか、ということを表す。
    • ステートによって決まるものは、あるイベントが送られてきた際のコンテキスト。
      • ステートとは、関数。
      • あるイベントがステートへ送られるとは、ある引数(イベント)で関数(ステート)を実行するということ
      • つまり、イベントが送られた際のコンテキストというのは、どの関数(ステート)その引数(イベント)を待ち受けているのか?ということを表す。

gen_fsm の概要図

gen_fsm の紹介.png

状態(ステート) とは

  • 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 非同期
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2