新增一個 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 狀態