使用 via 元组注册 GenServer 时遇到问题。 ** (UndefinedFunctionError) 函数 PokerServer.whereis_name/1 未定义或私有)
Trouble registering a GenServer with a via tuple. ** (UndefinedFunctionError) function PokerServer.whereis_name/1 is undefined or private)
这是一个非常简单的 GenServer。我正在尝试使用 via 元组在初始化时注册它。
defmodule PokerServer do
use GenServer
def start(id) do
GenServer.start(__MODULE__, id, name: {:via, __MODULE__, id})
end
@impl GenServer
def init(id) do
{:ok, id}
end
end
除非我在 the documentation 中误解了什么,否则我应该能够在 GenServer 的第三个参数中将 via 元组作为名称传递。start/3
除了当我尝试在 iex shell 中启动进程时,我触发了一个错误
iex(1)> PokerServer.start(123)
** (UndefinedFunctionError) function PokerServer.whereis_name/1 is undefined or private
(live_draft 0.1.0) PokerServer.whereis_name(123)
(stdlib 3.14.2.2) gen.erl:83: :gen.start/6
编辑:我使用 elixir 1.12.3 和 erlang/OTP 23
您在 {:via, __MODULE__, id}
中传递的模块应该导出 register_name/2
、unregister_name/1
、whereis_name/1
和 send/2
。例如:
def start(id) do
GenServer.start(__MODULE__, id, name: {:via, :global, id})
end
One such example is the :global
module which uses these functions for keeping the list of names of processes and their associated PIDs that are available globally for a network of Elixir nodes. Elixir also ships with a local, decentralized and scalable registry called Registry
for locally storing names that are generated dynamically. Documentation
这是一个非常简单的 GenServer。我正在尝试使用 via 元组在初始化时注册它。
defmodule PokerServer do
use GenServer
def start(id) do
GenServer.start(__MODULE__, id, name: {:via, __MODULE__, id})
end
@impl GenServer
def init(id) do
{:ok, id}
end
end
除非我在 the documentation 中误解了什么,否则我应该能够在 GenServer 的第三个参数中将 via 元组作为名称传递。start/3
除了当我尝试在 iex shell 中启动进程时,我触发了一个错误
iex(1)> PokerServer.start(123)
** (UndefinedFunctionError) function PokerServer.whereis_name/1 is undefined or private
(live_draft 0.1.0) PokerServer.whereis_name(123)
(stdlib 3.14.2.2) gen.erl:83: :gen.start/6
编辑:我使用 elixir 1.12.3 和 erlang/OTP 23
您在 {:via, __MODULE__, id}
中传递的模块应该导出 register_name/2
、unregister_name/1
、whereis_name/1
和 send/2
。例如:
def start(id) do
GenServer.start(__MODULE__, id, name: {:via, :global, id})
end
One such example is the
:global
module which uses these functions for keeping the list of names of processes and their associated PIDs that are available globally for a network of Elixir nodes. Elixir also ships with a local, decentralized and scalable registry calledRegistry
for locally storing names that are generated dynamically. Documentation