2017-04-30 4 views
0

나는대로 초기화되는 노동자는 다음과 같습니다글로벌 프로세스 이름에 대한 프로세스 ID를 검색 할 수 없습니다

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 

여기에 뭔가가 빠졌습니까? 내가 프로세스를 제대로 명명하지 않은 것 같습니다.

답변

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> 
+0

감사합니다 - 위의 설명에 대한 문서가있다? {{global, {: name, name}}'의 일부가 프로세스의 실제 이름 인 엘릭서 문서를 찾을 수 없습니다. – category

+1

https://hexdocs.pm/elixir/GenServer.html#module-name-registration에 "{: global, ** term **} - GenServer가 전역으로 등록되었습니다. ** 주어진 용어로 ** the : 글로벌 모듈. " – Dogbert