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
- 仅仅这一个子进程重启
- one_for_one:
- intensity:
- 启动次数
- period
- 周期
- strategy 主进程对多有进程的重启策略(只有在子进程重启后才会生效,子进程重启规则见下面restart参数的介绍)
-
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后,多长时间收不到返回信号
- 在涉及到重启子进程的时候,优先通过exit(Pid, shutdown)的方式告知子进程要重启,此时子进程可以做一些工作。当超过5000ms的时候还没有收到子进程返回的‘DOWN’的信号时,就会强制给子进程发一个exit(Pid, kill)的信号。
- type:worker
- module:[emqttd_sysmon]
-
gen_server框架机制参见
遗留问题
- 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回调函数。
- start_child流程
- start_child流程就不单独画图分析了,大概流程如下:
- 1、优先调用Sup=supervisor:start_link函数
- 2、在调用supervisor:start_child(Sup, ChildSpec)
- 3、supervisor中调用call接口,最后调用gen_server:call接口,执行apply最终启动ChildSpec中的回调函数
- start_child流程就不单独画图分析了,大概流程如下: