Erlang OTP四大行为模式之一gen_server解析和案例

本文介绍了Erlang OTP中的gen_server行为模式,解释了其作为进程框架的作用,通过解耦和复用提高代码效率。gen_server在接收到消息后,将调用callback模块进行处理,扮演代理角色。示例展示了如何创建一个简单的KV存储服务器,说明了gen_server如何启动、处理请求和更新状态。
摘要由CSDN通过智能技术生成

在刚接触otp gen_server时很多人可能只是对着Erlang程序设计中的案例敲一遍,但对为什么要使用gen_server以及里面各个方法是如何联系和影响进程的估计都不太清楚。

首先讲下行为模式,你可以理解为面向对象中的设计模式(更像是模版方法模式),本质都是为了代码复用,当然你也可以把这些行为理解成为某种应用程序框架。我们往往在创建一个进程执行任务时都会有一下步骤,

1.spawn创建一个进程。2.执行初始化函数。3.初始化后进入循环体函数等待调用 4接受退出(如图下所示)

在上面的流程中我们发现,除了calls(接受信息并处理)方法外,其他都是通用的,这就是gen_server模块所要做的事情,提供除了用户自定义的calls回调函数外的通用的方法。

下面是一个sever的简单框架

-module(my_server).
-export([start/2, start_link/2, call/2, cast/2, reply/2]).

%%% Public API
start(Module, InitialState) ->
    spawn(fun() -> init(Module, InitialState) end).

start_link(Module, InitialState) ->
    spawn_link(fun() -> init(Module, InitialState) end).
	
%%同步调用
call(Pid, Msg) ->
    Ref = erlang:monitor(process, Pid),
    Pid ! {sync, self(), Ref, Msg},
    receive
        {Ref, Reply} ->
            erlang:demonitor(Ref, [flush]),
            Reply;
        {'DOWN', Ref, process, Pid, Reason} ->
            erlang:error(Reason)
    after 5000 ->
        erlang:error(timeout)
    end.
%%异步调用
cast(Pid, Msg) ->
    Pid 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值