gen_server 和 gen_fsm 的区别和应用--erlang

gen_server和gen_fsm都是Erlang中用于处理进程通信的工具,它们拥有相同的特点,如启动进程通信、维护消息队列和统一的消息处理。然而,gen_server的消息封装和回调函数更为简洁,适用于通用的数据处理和模块调用;而gen_fsm增加了状态管理,适合实现基于状态的模块,具有更细致的同步、异步方法和超时处理,便于状态转换和多状态循环切换。
摘要由CSDN通过智能技术生成

一. 相同点(特点):

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方法来进行接收。多个方法实现了对所有消息的处理。
    • </
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值