我的工作人员初始化如下:
defmodule GenServerDB.Worker do
use GenServer
def start_link(name) do
GenServer.start_link(__MODULE__, :ok, [name: {:global, {:name, name}}])
end
def init(:ok) do
{:ok, %{}}
end
end
然后我可以创建我希望使用:global
模块命名的工作人员:
iex(3)> {:ok, pid} = Supervisor.start_link([Supervisor.Spec.worker(GenServerDB.Worker, [], [])], strategy: :simple_one_for_one)
{:ok, #PID<0.126.0>}
iex(4)> Supervisor.start_child(pid, [[1]])
Supervisor.start_child(pid, [[1]])
{:ok, #PID<0.128.0>}
iex(6)> Supervisor.start_child(pid, [[2]])
Supervisor.start_child(pid, [[2]])
{:ok, #PID<0.131.0>}
iex(7)> Supervisor.start_child(pid, [[3]])
Supervisor.start_child(pid, [[3]])
{:ok, #PID<0.133.0>}
iex(8)> Supervisor.which_children(pid)
Supervisor.which_children(pid)
[{:undefined, #PID<0.128.0>, :worker, [GenServerDB.Worker]},
{:undefined, #PID<0.131.0>, :worker, [GenServerDB.Worker]},
{:undefined, #PID<0.133.0>, :worker, [GenServerDB.Worker]}]
但是,当我尝试获取给定pid
的{{1}}时,我会得到以下内容:
name
我在这里遗漏了什么吗?看起来我还没有正确地命名这个过程。
答案 0 :(得分:2)
您正在使用:global.whereis_name/1
来电中的参数。您在此处不需要{:global
,并且该流程的名称实际为{:name, [1]}
,因此您需要致电:global.whereis_name({:name, [1]})
。
defmodule GenServerDB.Worker do
use GenServer
def start_link(name) do
GenServer.start_link(__MODULE__, :ok, [name: {:global, {:name, name}}])
end
def init(:ok) do
{:ok, %{}}
end
end
{:ok, pid} = Supervisor.start_link([Supervisor.Spec.worker(GenServerDB.Worker, [], [])], strategy: :simple_one_for_one)
Supervisor.start_child(pid, [[1]])
Supervisor.start_child(pid, [[2]])
Supervisor.start_child(pid, [[3]])
IO.inspect Supervisor.which_children(pid)
IO.inspect :global.whereis_name({:name, [1]})
输出:
[{:undefined, #PID<0.77.0>, :worker, [GenServerDB.Worker]},
{:undefined, #PID<0.78.0>, :worker, [GenServerDB.Worker]},
{:undefined, #PID<0.79.0>, :worker, [GenServerDB.Worker]}]
#PID<0.77.0>