supervisorstart_link /start_child 启动流程

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中的回调函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值