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框架机制参见

遗留问题

  • 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中的回调函数
发布了11 篇原创文章 · 获赞 1 · 访问量 2442

猜你喜欢

转载自blog.csdn.net/linux_cwg/article/details/87277700
今日推荐