iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0
Software Development

Elixir 多工 : Processes 與 OTP系列 第 22

22 name: {:via, module, term}

  • 分享至 

  • xImage
  •  

除了一個 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/2unregister_name/1whereis_name/1send/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, "可以是動態的名字"}})


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

尚未有邦友留言

立即登入留言