gen_server行为模式

本文主要介绍gen_server行为模式的使用,gen_server的设计思将想下文“gen_server设计思想”中介绍。gen_server是开发中最常用的一种模式,使用gen_server时,需在模块中定义behaviour属性为gen_server,并实现回调接口init/1,handle_call/3,handle_cast/2,handle_info/2,code_change/3,terminate/2。

Module:init/1 在进程初始化时调用,其参数为列表,它相当于类的构造函数。调用gen_server:start或gen_server:start_link时会自动回调Module:init/1。init/1执行成功返回{ok,State},State为进程状态,记录进程的内部信息。当进程结束时,会自动回调Module:terminate/2函数,用户可以做相关收尾工作,它相当于类中的析构函数。

handle_cast/2接收gen_server:cast/2发过来的消息。gen_server:cast为异步调用,不需等待处理结果。handle_call/3接收gen_server:call/2发送的消息,gen_server:call为同步调用,需等待返回结果。handle_info/2处理进程收到的其他消息,如直接给进程发送的消息 Pid ! Msg。

下面是用gen_server简单模拟银行帐号存取钱的例子:

 

测试bank_account :

初始化时,帐号ID为1,名称为”Test”,资金为10000,帐号信息存在State中。

bank_account:withdraw(Pid,500)通过gen_server:call发送同步消息,由handle_call({withdraw,Num},_From,State}处理,把帐号信息更新为9500,并更新State状态。

bank_account:deposit(Pid,100)也通过gen_server:call发送同步消息,存100进去帐号中,消息交给handle_call({deposit,Num},_From,State)处理,资金变为9600同时更新State。

print/1通过gen_server:cast异步 发送print消息,handle_cast收到消息后打印帐号信息。

Pid ! Msg将交给handle_info处理。

stop/1,通过gen_server:cast发送stop消息,handle_cast处理返回{noreply,stop,State},进程停止,自动回调terminate函数。

调用 erlang:is_porcess_alive(Pid)返回false,说明进程已经停止。

使用gen_server模板,可以简单快速建立server服务,它具有良好的接口定义,封装了进程初始化,结束,同步,异步等接口,所以在开发过程被普遍使用。

 

Erlang技术分享内容均为原创,转载请标明本文地址
本文链接:http://www.kongqingquan.com/archives/403

此条目发表在Erlang分类目录,贴了, 标签。将固定链接加入收藏夹。

gen_server行为模式》有 1 条评论

  1. Pingback引用通告: gen_server设计思想 | Erlang技术分享

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">