iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0
Software Development

Elixir 多工 : Processes 與 OTP系列 第 24

24 DynamicSupervisor 搭配 Registry

  • 分享至 

  • xImage
  •  

新增一個 NiceBank.Manager 模組

defmodule NiceBank.Manager do
  use DynamicSupervisor

  def start_link(_) do
    IO.puts("Manager 啟動")
    DynamicSupervisor.start_link(__MODULE__, :ok, name: __MODULE__)
  end

  def start_child(name, initial_balance) do
    DynamicSupervisor.start_child(__MODULE__, {NiceBank.Bank, {name, initial_balance}})
  end

  @impl true
  def init(_arg) do
    DynamicSupervisor.init(strategy: :one_for_one)
  end
end

並在 `application.ex' 的 start 函式裡加上他

def start(_type, _args) do
  children = [
    NiceBank.Manager,
    {Registry, keys: :unique, name: NiceBank.Registry}
  ]

  opts = [strategy: :one_for_one, name: NiceBank.Supervisor]
  Supervisor.start_link(children, opts)
end

這樣我們就可以動態的替 supervisor 加上名字記錄在 Registry 的 child

iex(1)> NiceBank.Manager.start_child("Jack", 2000)
啟動以 Jack 註冊的戶頭。
開戶存了 2000 元。
{:ok, #PID<0.163.0>}
iex(2)> NiceBank.Manager.start_child("Eve", 1000)
啟動以 Eve 註冊的戶頭。
開戶存了 1000 元。
{:ok, #PID<0.166.0>}

另外在 observer 裡面也可以即時看得到 child 狀態

https://ithelp.ithome.com.tw/upload/images/20241008/20141054O9aZ00PFxS.png


上一篇
23 Registry
下一篇
25 Node (節點)
系列文
Elixir 多工 : Processes 與 OTP30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言