Erlang Behaviour行為模式之一:Supervisor之說明
阿新 • • 發佈:2018-12-16
具體文件詳看這裡
Supervisor(即主管程序,簡稱主管)負責啟動、停止以及監控主管子程序。主要想法是當必需時,通過重啟子程序保持他們的存活。通過子規範列表啟動並監控子程序,按照規範列表的順序啟動程序並以反序終止程序。
通用伺服器Behaviour中啟動伺服器的回撥模組大概看起來是這樣的:
-module(ch_sup). -behaviour(supervisor). -export([start_link/0]). -export([init/1]). start_link() -> supervisor:start_link(ch_sup, []). init(_Args) -> SupFlags = #{strategy => one_for_one, intensity => 1, period => 5}, ChildSpecs = [#{id => ch3, start => {ch3, start_link, []}, restart => permanent, shutdown => brutal_kill, type => worker, modules => [cg3]}], {ok, {SupFlags, ChildSpecs}}.
- 策略(strategy)
①one_for_one:如果某子程序被終止了,只重啟該子程序
②all_for_one:如果某子程序被終止了,其它所有程序也終止然後全部按照list順序重啟
③rest_for_one:如果某子程序終止了,該程序以後的程序被終止並按照順序重啟
④simple_one_for_one:與one_for_one類似,通過動態新增例項啟動程序,也就是在此策略下的主管不會馬上啟動,而是通過呼叫 supervisor:start_child(Sup, List) 函式才啟動,其結果就是由apply(ch3, start_link, [] ++ List)呼叫的程序 - 最大重啟次數(intensity):超過次數則不再重啟
- 最大重啟時間(period):超時則停止
- 主管id(id):id用來識別主管的子程序
- 啟動函式(start):通過apply(M, F, A)啟動
- 重啟策略(restart):
①permanent 決定了程序一直重啟;
②temporary 一旦終結,不再重啟;
③transient如果子程序發生除了以normal,shutdown或者{shutdown, Term}等為原因的異常,則進行重啟。 - 關閉(shutdown)決定著子程序如何被終結:
①brutal_kill意味著子程序通過exit/2無條件退出終結;
②整數型數值意味著程序收到退出訊號後,N個單位時間後終結程序;
③infinity意味著如果子程序是另一主管程序,如果設定了infinity識別符號,就表示該主管可以留出足夠的時間退出。shutdown選項可選,如果程序是worker程序,則預設為5000毫秒;如果程序是主管,則預設infinity。 - 型別(type)決定程序的型別:
①worker工作程序
②supervisor主管程序