2016-10-12 27 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查询这个样子。

相关问题