zoukankan      html  css  js  c++  java
  • erlang四大behaviour之一gen_server

     
    来源: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)的调用,你的清理工作就可以在这继续了。

  • 相关阅读:
    orbis 链接 .a的问题
    程序的循环结构
    程序分支控制
    字符类型及常用的函数
    数字数据类型
    基础练习
    了解计算机
    python基础练习
    markdown基本使用
    jupyterhub
  • 原文地址:https://www.cnblogs.com/yanwei-wang/p/4469094.html
Copyright © 2011-2022 走看看