iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0

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
}

type:

這個 process 的種類

  • 預設為 :worker
  • 如果這個 child 也是 supervisor 則為 :supervisor

shutdown:

告訴 supervisor 要怎麼關閉這個 child process

如果 type 為 worker,預設為 5000,如果 type 為 supervisor,預設則是 :infinity

可有的選項為:

  • brutal_kill 直接關閉
  • 正整數毫秒
  • :infinity

restart:

告訴 supervisor 這個 child process 的重新啟動行為

可有的選項為:

  • :permanent 正常重開,此為預設值
  • :temporary 不管 supervisor 的設定,這個 child 不給重開
  • :transient 只在意外發生時重啟,正常的關閉理由如 :normal, :shoutdown{:shutdown, term} 不重開

上一篇
16 在 mix 專案使用 Supervisor
下一篇
18 Supervision tree
系列文
Elixir 多工 : Processes 與 OTP30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言