supervisor start_link 流程分析
SupFlags参数介绍 eg: {one_for_one, 10, 100}
strategy 主进程对多有进程的重启策略(只有在子进程重启后才会生效,子进程重启规则见下面restart参数的介绍)
one_for_one:
仅仅重新这一个子进程
one_for_all:
shutdown掉所有的子进程,重新启动所有子进程
rest_for_one:
在这个子进程之后启动的 其他子进程都会重启
simple_one_for_one
仅仅这一个子进程重启
intensity:
启动次数
period
周期
StartSpec参数介绍 eg:{sysmon, {emqttd_sysmon, start_link, [Env]},permanent, 5000, worker, [emqttd_sysmon]}
id:sysmon
start:{emqttd_sysmon, start_link, [Env]} 子进程启动函数
restart:
permanent:任何错误信号都会重新启动该子进程(包括正常信号normal, shutdown)
transient:非normal、shutdown类型的信号,其他异常退出信号都会重启该子进程
temporary:不会重新启动该子进程
shutdown:infinity/brutal_kill/5000
在涉及到重启子进程的时候,优先通过exit(Pid, shutdown)的方式告知子进程要重启,此时子进程可以做一些工作。当超过5000ms的时候还没有收到子进程返回的‘DOWN’的信号时,就会强制给子进程发一个exit(Pid, kill)的信号。
infinity:一直等待子进程重启完毕
brutal_kill:强制关掉子进程
5000:给子进程发shutdown后,多长时间收不到返回信号
type:worker
module:[emqttd_sysmon]
gen_server框架机制参见
启动
消息发布call
消息发布cast
直接发布info
遗留问题
StartSpec中的type如何使用?
注意
start_link 和 start_child 指定的参数有差别, 在StartSpec参数上,前一个是列表,后一个是元组。
两个记录之间的关系 state child: child中存放子进程的相关信息 state中有个children的字段,当child调用apply创建子进程后,会将Pid放入到child记录中,同时将child保存到children中,这样两个记录就建立关系了
通过gen_server机制中的handle_info机制来触发,当一个进程异常退出的时候,link的进程会收到一个‘EXIT’的退出信号保存在link进程的邮箱中,故会调用handle_info回调函数。
supervisor start 启动流程
start_child流程
start_child流程就不单独画图分析了,大概流程如下:
1、优先调用Sup=supervisor:start_link函数
2、在调用supervisor:start_child(Sup, ChildSpec)
3、supervisor中调用call接口,最后调用gen_server:call接口,执行apply最终启动ChildSpec中的回调函数