gen_fsm 是一个OTP的MODULE。 功能是去实现一个有限状态自动机的程序。
有限状态自动机其实是非常有用的东西,我以前曾经使用过FSM开发过一个自动游戏的机器人程序。
当你要用gen_fsm来开发一个自动机程序的基本方法是在自己的模块中behavior(gen_fsm)这个模块。
个人觉得behavior有点类似于OO语言里继承机制。gen_fsm相当于是一个已经封装好了各种自动机行为和内部数据的基本类型。而你要去开发的是一个特定的自动机程序,所以是gen_fsm这个自动机的一种特例。所以gen_fsm有点像父类,而你要开发的是去继承这个父类的子类。
如何去自定义你的状态机的行为呢?你需要在你的MODULE里提供一些callback出来,供gen_fsm调用。
需要去实现的callback:
start/1
start_link/1
init/1
terminate/3
。。。
其实有很多很多的callback, 但 不需要一一实现。
文章:
http://learnyousomeerlang.com/finite-state-machines
这文章以一个自动交易的自动机程序作为例子介绍了gen_fsm的使用。例子比较复杂,我看了6个番茄钟的时间。
然后自己尝试写了一个简单的自动机程序。
状态迁移为:
idle
/ \
angry - happy
感兴趣的可以看看代码:
https://coding.net/costaxu/boygirl.git
自问自答几个问题:
Q send_event和sync_send_event的区别?
A send_event是异步请求
sync_send_event是同步请求,服务器一定会应答或者客户端超时才会函数退出。
Q sync_send_event 与 sync_send_all_state_event的区别?
A sync_send_event是每个状态自己要处理的。
sync_send_all_state_event统一由handle_sync_event回调函数来处理。