除了一個 atom 可以使用在 name option 之外,還有
{:global, term}
GenServer 會使用 :global
模組(erlang) 提供的函式進行跨 node 的註冊。 不同 node 上的 process 可以透過 {:global, term} 互相傳送訊息。
def start_link(init_balance) do
GenServer.start_link(__MODULE__, init_balance, name: {:global, __MODULE__})
end
{:via, module, term}
GenServer 會使用指定的模組和 term 進行註冊。:via
,這個模組必須有實現 register_name/2
、unregister_name/1
、whereis_name/1
和 send/2
等函式。上一個 :global
選項使用的 :global
模組就是一個例子,使用這些函式來管理 process 的全域名稱和 PID 的對應關係,其中一個應用便是動態的管理註冊的名稱邏輯。
不過我們不需要自己寫,Elixir 提供了 Registry
模組,可以讓我們動態產生並儲存 name。
# 開啟 Registry
{:ok, _} = Registry.start_link(keys: :unique, name: NiceBank.Registry)
GenServer.start_link(__MODULE__, init_balance, name: {:via, Registry, {NiceBank.Registry, "可以是動態的名字"}})