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目录下.