来源:http://www.cnblogs.com/puputu/articles/1701017.html
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开始的连入监控树的
  2. 一般情况不需要提供自己的停止函数,监控进程会自动处理,但是如果你想在gen_server进程中自己清理以下资源,那么就必须在init函数里调用 process_flag(trap_exit, true)来捕获退出信号,这会导致调用terminate(shutdown, State)函数,所以你也必须实现这个函数

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

erlang四大behaviour之一gen_server的更多相关文章

  1. erlang四大behaviour之一gen_server(转载)

    erlang程序设计里面有个设计原则就是把你的进程构造成树,把共用代码提出来,特定功能用自己的module实现,这也就是behaviour了,应用behaviour可以减少与本身事务无关的代码量,设计 ...

  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. iOS开发系列-UI基础-KVC

    这些知识是UI初级学习的,目前我还在学习中,适合初学者看 KVC—Key Value Coding 也就是键值编码 是一种获取值和设置值的方式 当我们创建一个类文件,为这个类设置成员属性的时候: 创建 ...

  2. do{...}while(0)的意义和用法(转载)

    linux内核和其他一些开源的代码中,经常会遇到这样的代码: do{ ... }while(0) 这样的代码一看就不是一个循环,do..while表面上在这里一点意义都没有,那么为什么要这么用呢? 实 ...

  3. java 生成条形码

    package com.sun.erwei; import java.awt.image.BufferedImage;import java.io.ByteArrayOutputStream;impo ...

  4. [Q]pdfFactory打印机内存不能为read的问题

    运行环境:xp系统,AutoCAD2007 1. 使用pdfFactory打印文本文件没有问题. 2. 使用CAD打印的时候出现问题,使用CAD自带的PLOT命令打印也出现相同的问题. 3. 使用相同 ...

  5. putty 使用 注意事项

    putty命令行模式,修改文本 小心数字小键盘 变命令!! 务必在putty--选项 Terminal->Features 里,找到 Disable application keypad mod ...

  6. vultr vps新增reserved IPs功能,保留服务器原有IP

    高性价比海外vps品牌vultr vps宣布一项新功能叫“reserved IPs”,顾名思义是帮助你保留服务器IP地址,以备后用. 这个需求是因为用户经常新建.删除一个vps服务器,默认分配的是随机 ...

  7. 基于PHP——简单的WSDL的创建(WSDL篇)

    1.建立WSDL文件      建立WSDL的工具很多,eclipse.zendstudio.vs都可以,我个人建议自己写,熟悉结构,另外自动工具对xml schame类型支持在类型中可能会报错. 下 ...

  8. Oralce生成前N年的年数据

    今天做一个统计报表的时候正好碰到这个问题,原来,一般是通过后台代码来生成.现在直接通过oracle来生成,记录一下. 方法一: SELECT YEAR FROM ( , UNION SELECT TO ...

  9. laravel 日志

    laravel学院的 http://laravelacademy.org/post/195.html 他人博客的 http://www.cnblogs.com/yjf512/p/4173261.htm ...

  10. 用两个栈实现队列,剑指offer P59

    public class QueueByStack { private Stack<Integer> stack1; private Stack<Integer> stack2 ...