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中的回調函數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章