1. 程式人生 > >Erlang Behaviour行為模式之一:Supervisor之說明

Erlang Behaviour行為模式之一:Supervisor之說明

具體文件詳看這裡
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主管程序