无法检索全局进程名称的进程 ID
cannot retrieve process id for global process name
我有一个工人初始化如下:
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]}]
然而,当我尝试获取给定 name
的 pid
时,我得到以下信息:
iex(9)> :global.whereis_name({:global, {:name, 1}})
:global.whereis_name({:global, {:name, 1}})
:undefined
我是不是漏掉了什么?看来我没有正确命名进程。
您正在使用 :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>
我有一个工人初始化如下:
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]}]
然而,当我尝试获取给定 name
的 pid
时,我得到以下信息:
iex(9)> :global.whereis_name({:global, {:name, 1}})
:global.whereis_name({:global, {:name, 1}})
:undefined
我是不是漏掉了什么?看来我没有正确命名进程。
您正在使用 :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>