gen_server与gen_fsm的异同与应用
一. 相同点(特点):
1. 启动进程通信
- gen_server和gen_fsm都是通过gen模块来启动一个持续recv的进程,监听着进程外给自己发送的消息,或者是自己给自己发送的消息。
2. 维护消息队列(消息邮箱)
- gs和gf都维护了一个消息邮箱,类似于消息队列的数据结构,存储着进程收到的所有消息。在消息队列不为空时,会向消息队列获取消息,并消费消息,对消息做出对应的处理。
3. 唯一进程消息处理与分发
- 从模块方法上看,erleng 的gs和gf都是通过gen_server与gen_fsm模块统一调用和消息分发。
- 以gen_server为例,start_link()方法是其实是在gen_server方法进程里以模块名为pid的方式进行了注册
- 调用方式是由gen_server的cast或者call方法,gen_server会在进程中找到对应模块的pid,然后进行转发。
- 通过消息的传递从而达到多模块之间互相调用的效果。
- 消息的处理方式以及具体逻辑由自己模块的回调函数决定
- 模块调用handle方法实际上由自己决定。因为gen_server对cast与call方法都进行了一定的消息封装
- 标记了-behavior(gen_server)的进程可以自动解析带有特殊封装的消息然后调用handlecast或handlecall方法。
- 不包含特殊封装的方法则会全都调用handle_info方法来进行接收。多个方法实现了对所有消息的处理。 </