无法检索全局进程名称的进程ID

时间:2017-04-30 14:58:49

标签: process elixir global worker supervisor

我的工作人员初始化如下:

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

我在这里遗漏了什么吗?看起来我还没有正确地命名这个过程。

1 个答案:

答案 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>