erlang行为模式

一、supervisor监督者

重启策略:

one_for_one只影响当前child

one_for_all-影响所有children

rest_for_one-影响当前和"rest"order后面的child

simple_one_for_one-所有的child运行同一个模块

delete_child/2andrestart_child/2areinvalidforsimple_one_for_one

child_spec()={Id,StartFunc,Restart,Shutdown,Type,Modules}

Id->标示符.

StartFunc->{M,F,A}

Restart:permanent|transient|temporary

permanent->alwaysberestarted

temporary->neverberestarted

transient->非正常死亡是会重启,exit

即exitreason不是normal,shutdownor{shutdown,Term}之一.

Shutdown=brutal_kill|int()>0|infinity

Type=worker|supervisor

Modules=[Module]|dynamic用于代码升级

创建并链接监督者进程:

start_link(Module,Args)->

start_link(SupName,Module,Args)->//注册进程名SupName

SupName->{local,Name::atom()}|{global,Name::atom()}

Args当做回调模块Module:init/1的参数.

如果有child进程启动失败,那么监督者进程也会启动失败

启动子进程:

start_child(SupRef,ChildSpec)->startchild_ret()

SupRef->pid|name|{name,node}|{global,name}表示监督者进程

当simple_one_for_one,ChildSpec表示一个参数List,apply(M,F,A++List)

当others,ChildSpec才表示子进程的规范,如果规范Id已经存在,那么会报错。

终止子进程:

terminate_child(SupRef,Id)->Result

当simple_one_for_one,Id表示子进程的pid

当others表示规范Id.

删除规范Id(前提SpecId对应的进程已经终止)

delete_child(SupRef,Id)->Result

重启子进程:

restart_child(SupRef,Id)->Result

回调函数:

Module:init(Args)->Result

Result->{ok,{{RestartStrategy,MaxR,MaxT},[ChildSpec]}}|ignore

MaxRandMaxT表示在MaxT时间重启的次数不能超过MaxR

二、gen_server通用服务器

gen_server:start_link----->Module:init/1

gen_server:call----->Module:handle_call/3

gen_server:cast----->Module:handle_cast/2

------>Module:handle_info/2

------>Module:terminate/2

------>Module:code_change/3

如果回调函数fail或返回badvalue,那么gen_server将会终止.

agen_serverdoesnottrapexitsignalsautomatically,必须要手动设置.

启动并链接gen_server:

start_link(Module,Args,Options)->Result//不注册别名

start_link(ServerName,Module,Args,Options)->Result//

//ServerName->{local,name}|{global,name}

同步调用:

call(ServerRef,Request)->Reply

call(ServerRef,Request,Timeout)->Reply

该调用等待areplyarrivesoratimeoutoccurs才返回。

异步调用:

cast(ServerRef,Request)->ok

就算gen_server不存在,也会立刻返回ok.

初始化回调:Module:init(Args)->Result

Result={ok,State}|{ok,State,Timeout}|{stop,Reason}|ignore

Timeout为0则立刻触发一个timeout消息。为infinity则不会触发timeout。(毫秒)

注:handle_info处理timeout消息

同步回调:

Module:handle_call(Request,From,State)->Result

Result={reply,Reply,NewState}|{reply,Reply,NewState,Timeout}

|{noreply,NewState}|{noreply,NewState,Timeout}

|{stop,Reason,Reply,NewState}|{stop,Reason,NewState}

From表示发送者的进程pid或注册名

Stateistheinternalstateofthegen_server.

reply表示Reply作为gen_server:call的返回值

noreply表示Reply表示显示地调用gen_server:reply/2.

stop表示gen_server将会调用terminate(Reason,NewState)进而终止.

NewState更新后的internalstate

异步回调:

Module:handle_cast(Request,State)->Result

Result={noreply,NewState}|{noreply,NewState,Timeout}

|{stop,Reason,NewState}

Timeout等消息回调:

Module:handle_info(Info,State)->Result

Result={noreply,NewState}|{noreply,NewState,Timeout}

|{stop,Reason,NewState}

终止回调:

Module:terminate(Reason,State)

Reason=normal|shutdown|{shutdown,term()}|term()

当回调返回stop项式或产生异常,会体现在Reason里.

代码更新回调:

Module:code_change(OldVsn,State,Extra)->{ok,NewState}|{error,Reason}

三、application应用程序

加载app规范(包括依赖App的,但不是加载代码):

load(AppDescr)->ok|{error,Reason}

load(AppDescr,Distributed)->ok|{error,Reason}

applicationcontroller控制者,

AppDescr可以是应用的名字或者应用规范的项式

启动应用:

start(Application)->ok|{error,Reason}

start(Application,Type)->ok|{error,Reason}

Theapplicationcontrollerthencreatesanapplicationmasterfortheapplication.Theapplicationmasteristhegroupleaderofalltheprocessesintheapplication.

TheapplicationmasterstartstheapplicationbycallingtheapplicationcallbackfunctionModule:start/2asdefinedbytheapplicationspecificationkeymod.

停止应用:

stop(Application)->ok|{error,Reason}

获取配置变量(通过.app中配置):

get_env(Par)->undefined|{ok,Val}

get_env(Application,Par)->undefined|{ok,Val}

应用.app文件:在ebin目录下.

相关推荐