erlang gen_server行为模式
2013-07-06 10:27
288 查看
客户端-服务器端(C/S)模型的特点是:一个中央服务器和任意数量的客户端。C/S模型通常用于资源管理操作,其中一些不同的客户端要共享一个公共资源。服务器负责管理这些资源。
服务器可以用 gen_server 进行重写,结果产生这个回调模块:
start_link 调用了函数
gen_server:start_link/4 。这个函数产生了一个新进程一个gen_server并联接到其上。
第一个参数 {local,
ch3} 指定了名称。在这种情况下,gen_srever将在本地被注册为
ch3 。如果忽略名称,那么这个gen_server就不会被注册了,这时就必须使用其pid。名称也可以以
{global,
Name} 的形式给出,这种情况下gen_server则会使用 global:register_name/2 来进行注册。
第二个参数, ch3, 则是回调模块的名字,也就是回调函数所放的那个模块。在这里,接口函数(
start_link,
alloc 和 free )和回调函数(init,
handle_call 和
handle_cast)。一般来说这是好的编程实践,将代表同一个进程的代码包含在同一个模块中。
第三个参数,[], 这个值将被原封不动传递给回调函数
init。在这里,init无须任何输入数据将忽略这个参数。
第四个参数,[],是参数的列表。具体的参数请查看
gen_server(3) 。
在注册名称成功后,新的gen_server进程会调用回调函数
ch3:init([]).。init返回
{ok, State} ,其中
State 是gen_server的内部状态。在这里,状态就是可用的频道。
注意 gen_server:start_link 是同步的。只有等到gen_server被完全初始化并准备接受请求之后才会返回。
如果gen_server是某棵监督树的一部分,即gen_server是由一个督程启动的,那么必须使用
gen_server:start_link 。还有另外一个函数
gen_server:start 用于启动一个独立的gen_server,即不是某棵监督树一部分的一个gen_server。
ch3 是gen_server的名字,必须和启动时的名字一样。
alloc 是实际的请求。
请求以消息的形式发送给这个gen_server。当收到了请求之后,gen_server调用
handle_call(Request,
From, State) ,它应返回一个元组
{reply, Reply,
State1}。Reply是需要回馈给客户端的答复,同时
State1 是gen_server的状态的新值。
在这里,应答是分配了的频道 Ch 然后gen_server将等待新的请求,并且现在保持了一个最新的可用频道的列表。
ch3 是gen_server的名称。
{free, Ch} 是实际的请求。
请求被装在一个消息中发给gen_server的
cast ,这调用了 free ,然后返回了
ok 。
当gen_server收到请求之后,它会调用
handle_cast(Request, Stats) ,会返回一个元组
{noreply,
State1} 。 State1 是gen_server状态的新值。
在这里,新的状态便是更新过的可用频道列表 Chs2 。gen_server现在又可以接受新的请求了。
若gen_server是某个监督树的一部分,则无需停止函数。它的督程会自动终止它。它的具体做法由督程中设置的 定义。
如果在终止之前需要进行一些清理工作,那么关闭策略必须是一个超时值,同时gen_server必须在
init 函数中设置为捕获退出信号。当gen_server被要求关闭时,它就会调用回调函数
terminate(shutdown, State) :
服务器可以用 gen_server 进行重写,结果产生这个回调模块:
-module(ch3). -behaviour(gen_server). -export([start_link/0]). -export([alloc/0, free/1]). -export([init/1, handle_call/3, handle_cast/2]). start_link() -> gen_server:start_link({local, ch3}, ch3, [], []). alloc() -> gen_server:call(ch3, alloc). free(Ch) -> gen_server:cast(ch3, {free, Ch}). init(_Args) -> {ok, channels()}. handle_call(alloc, _From, Chs) -> {Ch, Chs2} = alloc(Chs), {reply, Ch, Chs2}. handle_cast({free, Ch}, Chs) -> Chs2 = free(Ch, Chs), {noreply, Chs2}.
start_link 调用了函数
gen_server:start_link/4 。这个函数产生了一个新进程一个gen_server并联接到其上。
第一个参数 {local,
ch3} 指定了名称。在这种情况下,gen_srever将在本地被注册为
ch3 。如果忽略名称,那么这个gen_server就不会被注册了,这时就必须使用其pid。名称也可以以
{global,
Name} 的形式给出,这种情况下gen_server则会使用 global:register_name/2 来进行注册。
第二个参数, ch3, 则是回调模块的名字,也就是回调函数所放的那个模块。在这里,接口函数(
start_link,
alloc 和 free )和回调函数(init,
handle_call 和
handle_cast)。一般来说这是好的编程实践,将代表同一个进程的代码包含在同一个模块中。
第三个参数,[], 这个值将被原封不动传递给回调函数
init。在这里,init无须任何输入数据将忽略这个参数。
第四个参数,[],是参数的列表。具体的参数请查看
gen_server(3) 。
在注册名称成功后,新的gen_server进程会调用回调函数
ch3:init([]).。init返回
{ok, State} ,其中
State 是gen_server的内部状态。在这里,状态就是可用的频道。
注意 gen_server:start_link 是同步的。只有等到gen_server被完全初始化并准备接受请求之后才会返回。
如果gen_server是某棵监督树的一部分,即gen_server是由一个督程启动的,那么必须使用
gen_server:start_link 。还有另外一个函数
gen_server:start 用于启动一个独立的gen_server,即不是某棵监督树一部分的一个gen_server。
ch3 是gen_server的名字,必须和启动时的名字一样。
alloc 是实际的请求。
请求以消息的形式发送给这个gen_server。当收到了请求之后,gen_server调用
handle_call(Request,
From, State) ,它应返回一个元组
{reply, Reply,
State1}。Reply是需要回馈给客户端的答复,同时
State1 是gen_server的状态的新值。
在这里,应答是分配了的频道 Ch 然后gen_server将等待新的请求,并且现在保持了一个最新的可用频道的列表。
ch3 是gen_server的名称。
{free, Ch} 是实际的请求。
请求被装在一个消息中发给gen_server的
cast ,这调用了 free ,然后返回了
ok 。
当gen_server收到请求之后,它会调用
handle_cast(Request, Stats) ,会返回一个元组
{noreply,
State1} 。 State1 是gen_server状态的新值。
在这里,新的状态便是更新过的可用频道列表 Chs2 。gen_server现在又可以接受新的请求了。
若gen_server是某个监督树的一部分,则无需停止函数。它的督程会自动终止它。它的具体做法由督程中设置的 定义。
如果在终止之前需要进行一些清理工作,那么关闭策略必须是一个超时值,同时gen_server必须在
init 函数中设置为捕获退出信号。当gen_server被要求关闭时,它就会调用回调函数
terminate(shutdown, State) :
相关文章推荐
- Erlang OTP编程初体验——gen_server和行为模式
- OTP行为模式浅析之(gen_server、application、supervisor)
- Erlang自定义gen_container行为模式开发
- Erlang:RabbitMQ源码分析 2. gen_server和gen_server2 深入剖析
- erlang中文手册——gen_server
- erlang(2) gen_server
- erlang中启动一个gen_server和一个纯粹进程的区别
- Erlang的gen_server的terminate使用的几点总结
- [小心得]对erlang(函数式语言)的新理解——有关gen_server, supervisor的小小理解
- [Erlang 学习笔记]erlang behaviour小结之gen_server
- Erlang gen_server:start_link/3 和gen_server:start_link/4
- Erlang generic standard behaviours -- gen_server terminate
- [Erlang 学习笔记]erlang behaviour小结之gen_server
- erlang(2) gen_server
- erlang中gen_server出现”exception exit: timeout_value“错误
- Erlang OTP设计原则Gen_Fsm行为
- Erlang OTP设计原则Gen_Fsm行为[转]
- Erlang generic standard behaviours -- gen_server hibernate
- Erlang如何查看gen_server系列的状态 (高级)
- erlang OTP gen_server 图解分析