2016-10-12 26 views
1

下面是一個簡單的測試主管:在Elixir中,使用simple_one_for_one主管和start_child,如何在主管中設置孩子的ID?

defmodule SupervisorTest.Worker.Supervisor do 
    use Supervisor 

    def start_link do 
    Supervisor.start_link(__MODULE__, :ok, name: __MODULE__) 
    end 

    def start_worker(args) do 
    Supervisor.start_child(__MODULE__, [args]) 
    end 

    def init(:ok) do 
    children = [ 
     worker(SupervisorTest.Worker, []) 
    ] 

    supervise(children, strategy: :simple_one_for_one) 
    end 
end 

這裏是我的更簡單的工人:

defmodule SupervisorTest.Worker do 
    use GenServer 

    def start_link(args) do 
    GenServer.start_link(__MODULE__, args) 
    end 

    def state(pid) do 
    GenServer.call(pid, :state) 
    end 

    def stop(pid) do 
    GenServer.stop(pid, :normal) 
    end 

    def handle_call(:state, _from, state) do 
    {:reply, state, state} 
    end 
end 

我非常希望能夠調用Supervisor.which_children與這名主管並取回名單子元組,其ID是生成的UUID。看起來我無法在initworker聲明中設置它。並沒有start_child/3需要選項。我不能打電話start_child/2與另一worker聲明的輸出...所以我看不到任何方法來設置ID的東西...任何想法?

寫下這段代碼,當我打電話給Supervisor.which_children時,每個子元組的第一個元素是:undefined

回答

2

Supervisor.which_children/1superviser:which_children/1的文檔,這是不可能的:simple_one_for_one監督員:

id - 如在兒童說明書或:undefinedsimple_one_for_one主管的情況下定義的

Id - 按照子規範或中的定義爲simple_one_for_one主管。

因此,對於simple_one_for_one主管,返回的元組的第一項始終爲:undefined

1

您可以在

def start_worker(args) do 
    uuid = <generate UUID>, 
    Supervisor.start_child(__MODULE__, [args, uuid]) 
end 

在操作者側產生UUID:

def start_link(args, uuid) do 
    GenServer.start_link(__MODULE__, [args, uuid]) 
end 

def init([args,uuid]) do 
    {:ok, #State{ uuid: uuid }} 
end 

,當你取which_children你可以通過左右它們的PID兒童的UUID查詢這個樣子。

相關問題