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流程就不單獨畫圖分析了,大概流程如下: