erlang四大behaviourの一つgen_server

17205 ワード


ソース:http://www.cnblogs.com/puputu/articles/1701017.html
erlangプログラムの設計の中には、あなたのプロセスを木にして、共通コードを持ち出して、特定の機能を自分のmoduleで実現するという設計原則があります.これはbehaviourです.behaviourを使って、自分の事務とは関係ないコード量を減らすことができます.設計ロジックはもっとはっきりしています.老纪さんは勉强しながらメモをとりましょう.
gen_serverは、複数のクライアントが一つのリソースを共有するためのサーバ/クライアントモデルを実現する.彼はいくつかのインターフェース関数といくつかのコールバック関数から構成されています.これらはエレラングの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(ch 3,alloc)の呼び出しによるhandle_コールは同期されています.gen_server:cast(ch 3、{free,Ch}の呼び出しにより、handle_castの呼び出しは、非同期です.簡単です
サーバープロセスを監視ツリーに接続したくないなら、直接gen_を使います.server:start起動プロセスは、このサーバープロセスが一般的なプロセスです.
gen_serverの停止ルール:
gen_をもってserver:start_linkからモニタツリーに接続する一般的には自分の停止関数を提供する必要はありません.監視プロセスは自動的に処理されます.serverプロセスでは自分で以下のリソースを整理します.init関数でprocessを呼び出す必要があります.flagsは終了信号をキャプチャするためにtrue関数を呼び出すことになりますので、この関数はを実装しなければなりません.
gen_をもってserver:startから始まる単独gen_server 彼を終了するのは比較的簡単で、直接gen_を呼び出します.server:cast(Name,stop)は、handle_の呼び出しにつながります.cast(stop、State)は、その実装に「stop、normal、State」を書き込むだけでいいです.最終的にはterminate(normal、State)の呼び出しを招きます.あなたの掃除作業はここで続けられます.