Supervisor 的監督的對象必須要有實踐 child_spec/1
函數來告訴 supervisor 如何啟動它。
好消息是,如果要監督的對象是 GenServer
, Agent
或是另一個 Supervisor
,我們在使用時 use GenServer
會把預設的 child_spect 帶入,所以不需要另外建立
預設的 child_spect 類似:
def child_spec(arg)
%{
id: __MODULE__,
start: {__MODULE__, :start_link, [arg]}
}
end
當 Supervisor 要啟動這個 child 時,會便呼叫 `Bank.start_link(100),因此我們使用之前的 tuple 寫法
children = [
{Bank, 100}
]
帶入這個函式時就變成完整的 child_spec
%{
id: Bank,
start: {Bank, :start_link, [100]}
}
另外除了 id 與 start 之外可以可選的調整的項目還有
%{
id: Bank,
start: {Bank, :start_link, [100]},
restart: :permanent,
shutdown: 5_000,
type: :worker
}
這個 process 的種類
:worker
:supervisor
告訴 supervisor 要怎麼關閉這個 child process
如果 type 為 worker,預設為 5000
,如果 type 為 supervisor,預設則是 :infinity
可有的選項為:
brutal_kill
直接關閉:infinity
告訴 supervisor 這個 child process 的重新啟動行為
可有的選項為:
:permanent
正常重開,此為預設值:temporary
不管 supervisor 的設定,這個 child 不給重開:transient
只在意外發生時重啟,正常的關閉理由如 :normal
, :shoutdown
或 {:shutdown, term}
不重開