erlang程序设计里面有个设计原则就是把你的进程构造成树,把共用代码提出来,特定功能用自己的module实现,这也就是behaviour了,应用behaviour可以减少与本身事务无关的代码量,设计逻辑更加清晰。老纪边学习边记录吧。

gen_server实现服务器/客户端模型,用于多个客户共用一个资源的这种情况。他由几个接口函数和几个回调函数组成(回调函数必须在你的module里定义)这些可以参考erlang的doc

举个例子:

-module(ch3).  %这是我们的回调模块,也是我们实现业务逻辑的模块
-behaviour(gen_server). % 说明我们应用gen_server这个behaviour
-export([start_link/0]).
-export([alloc/0, free/1]).
-export([init/1, handle_call/3, handle_cast/2]). %gen_server 的导出函数

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}.

gen_server:start_link的调用会生成一个服务器进程且连接到进程树,并调用我们的init函数。

gen_server:call(ch3, alloc)的调用导致对handle_call的调用,这是同步的。

gen_server:cast(ch3, {free, Ch})的调用导致对handle_cast的调用,这是异步的。很简单。

假如你不想把服务器进程挂入监控树的话,直接用gen_server:start启动进程,这是这个服务器进程就是一个普通进程了。

gen_server的停止规则:

  1. 以gen_server:start_link开始的连入监控树:

  一般情况不需要提供自己的停止函数,监控进程会自动处理,但是如果你想在gen_server进程中自己清理以下资源,那么就必须在init函数里调用process_flag(trap_exit, true)来捕获退出信号,这会导致调用terminate(shutdown, State)函数,所以你也必须实现这个函数

  2. 以gen_server:start开始的单独gen_server:

  终止他就比较简单,直接调用gen_server:cast(Name, stop),这会导致调用handle_cast(stop, State),它的实现里写入 {stop, normal, State}即可,它最终导致terminate(normal, State)的调用,你的清理工作就可以在这继续了。

erlang越看越喜欢,但是要深入要走的路还很长

本文属转载

原作者:老纪
原载:老纪博客版权所有。转载时必须以链接形式注明转载自老纪博客[http://www.jifuyi.com/]。
本文链接地址: http://www.jifuyi.com/one-of-erlang-behaviour-gen-server/

erlang四大behaviour之一gen_server(转载)的更多相关文章

  1. erlang四大behaviour之一gen_server

      来源:http://www.cnblogs.com/puputu/articles/1701017.html erlang程序设计里面有个设计原则就是把你的进程构造成树,把共用代码提出来,特定功能 ...

  2. erlang四大behaviour之四-supervisor

    http://www.cnblogs.com/puputu/articles/1689621.html 1. 监督规则 一个监督者负责启动.停止.监控他的子进程.监督者的一个基本概念就是当必要的时候重 ...

  3. erlang四大behaviour之二-gen_fsm

    来源:http://www.cnblogs.com/puputu/articles/1701012.html 今天介绍erlang的一个非常重要的behaviour,就是gen_fsm-有限状态机,有 ...

  4. erlang四大behaviour之三-gen_event

    来源:http://www.cnblogs.com/puputu/articles/1689623.html 1. 事件处理规则 在OTP中,事件管理器是一个事件可以发送到的命名对象,一个事件可以是一 ...

  5. Erlang generic standard behaviours -- gen_server system msg

    这是Erlang generic standard behaviors gen_server 分析的系列的最后一篇,主要分析gen_server module 辅助性的功能函数. 在gen_serve ...

  6. Erlang generic standard behaviours -- gen_server module

    在分析完gen module (http://www.cnblogs.com/--00/p/4271386.html)之后,就可以开始进入gen_server 的主体module 了.gen_serv ...

  7. Erlang generic standard behaviours -- gen_server hibernate

    hibernate 主要用于在内存空闲时,通过整理进程的stack,回收进程的heap 来达到回收内存节省资源的效果. hibernate 可用于OTP 进程以及普通进程, hibernate 的官方 ...

  8. Erlang generic standard behaviours -- gen_server noblock call

    在Erlang 系统中,经常需要gen_server 进程来处理共享性的数据,也就是总希望一个gen_server 进程来为多个普通进程提供某种通用性的服务,这也是gen_server 设计的初衷.但 ...

  9. Erlang generic standard behaviours -- gen_server terminate

    gen_server 主体 module 已经分析完了(http://www.cnblogs.com/--00/p/4271982.html),接着,分析下gen_server 中的terminate ...

随机推荐

  1. Xcode no visible @interface for XXX declares

    出现如上面的错误, 是因为没有找到这个方法, 要自己写一个这样的方法 , 如果这是个类目的方法的话,  需要在Target->Linking->Other Linker Flags中添加- ...

  2. mac 安装 composer

    使用 curl 指令下载: curl -sS https://getcomposer.org/installer | php 或是沒有安裝 curl ,也可以用 php 指令下载: php -r &q ...

  3. 浏览器下载附件Content-Disposition

    Content-disposition是MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展类型)协议的扩展,MIME协议指示MIME用户代理如何 ...

  4. centos7 yum安装redis(转)

    正如我们所知的那样,Redis是一个开源的.基于BSD许可证的,基于内存的.键值存储NoSQL数据库.Redis经常被视为一个数据结构服务器,因为Redis支持字符串strings.哈希hashes. ...

  5. Android之通知使用权

    通知使用权打开方式 设置--提示音和通知--通知使用权. 具体界面如图: 存在须要拥有通知使用权应用时: 不存在须要拥有通知使用权应用时: 用户为应用勾选复选框后系统弹dialog须要用户进一步确认时 ...

  6. nodejs vue SyntaxError:Block-scoped declarations (let,const,function,class) not yet supported

    下午在git上导入之前写的代码到本地环境,执行npm run dev报错. 在我之前的环境中是没有问题的,这个错误信息也没看懂是什么原因引起的, 猜测可能是nodejs版本太低,于是重新下载了一个wi ...

  7. servlet中ServletConfig的使用

    转自:http://www.zzzj.com/html/20090117/69483.html 前言 相对于ServletContext,ServletConfig是针对特定的Servlet的参数或属 ...

  8. Win7文件正在使用无法删除怎么办

    Windows 7下删除文件提示被占用?系统内置工具搞定 Windows7之家(www.win7china.com):Windows7下删除文件提示被占用?系统内置工具搞定 在Windows中,删除文 ...

  9. 主动通知Android系统图库进行更新

    项目中遇到调用图库进行图片的选择,因为不能主动及时更新,遂实现代码调用实现主动及时更新. 废话不多刷,看代码. 方式一,发送一个广播, sendBroadcast(new Intent(Intent. ...

  10. 我装win8与win7双系统的血泪史

    前段时间教徒弟装系统,由于笔记本原带了win8,他不想换掉原来的系统.遂决定装个双系统.于是按照之前的一贯套路,但是出现了问题. 一. 首先遇到的问题是:如何进入BIOS,设置成U盘启动.Win XP ...