二郎山 - 起价监督模块孩子(Erlang - Starting a child from the

2019-09-18 07:23发布

我试图创建它处理添加动态gen_servers监事。 是有原因的东西是失败的,我真的不知道是什么。

-module(supervisor_mod).
-behaviour(supervisor).

-export([start_link/0, add_child/1]).
-export([init/1]).

start_link() ->
    Pid=supervisor:start_link({local, ?MODULE} , ?MODULE, []),
    {ok,Pid}.

init(_Args) ->
    {ok, {{simple_one_for_one, 10, 60},
          [{example_proc, {example_proc, start_link, []},
            permanent, brutal_kill, worker, [example_proc]}]}}.

add_child(Name)->                                                                        
    supervisor:start_child(supervisor_mod,
                           {example_proc, {example_proc, start_link, []},
                            permanent, brutal_kill, worker, [example_proc]}).

-module(example_proc).
-behaviour(gen_server).

-export([start_link/0]).
-export([init/1, handle_call/3, handle_cast/2]).

start_link() ->
    gen_server:start_link(?MODULE, [], []).

init(Args) ->
    io:format("~p (~p) started...~n", [Args, self()]),
    {ok, []}.

handle_call(alloc, From, State) ->
    {reply, From, State}.

handle_cast({free, _Ch}, State) ->
    {noreply, State}.

Erl的外壳:

Eshell V5.8.2  (abort with ^G)
1> supervisor_mod:start_link().
{ok,{ok,<0.33.0>}}
2> supervisor_mod:add_child(aa).
{error,{'EXIT',{badarg,[{erlang,apply,
                                [example_proc,start_link,
                                 {example_proc,{example_proc,start_link,[]},
                                               permanent,brutal_kill,worker,
                                               [example_proc]}]},
                        {supervisor,do_start_child_i,3},
                        {supervisor,handle_call,3},
                        {gen_server,handle_msg,5},
                        {proc_lib,init_p_do_apply,3}]}}}

任何帮助/解释/解决方案表示赞赏,/秒。

Answer 1:

阅读OTP文件:在简单的一对一策略的情况下,在start_child功能,您可以传递参数作为孩子的孩子START_LINK功能列表。



Answer 2:

当您使用simple_one_for_one所有的孩子都将使用相同的ChildSpec,在一个给定init/1的回调,这初始化只能返回一个 ChildSpec。 此外,在这种情况下,第二个参数supervisor:start_child/2必须是一个列表而不是一个ChildSpec。 该列表中的哪一个附加到默认ChildSpec给出的参数列表额外的参数列表,并且它是在呼唤孩子的启动功能时使用这一组合参数列表。 这是怎么simple_one_for_one孩子们都可以使用相同的ChildSpec而且还可以在特定的参数,让他们。

在你的情况下,有一个在ChildSpec一个空列表,你叫start_child/2与空单的参数启动功能的总数为0 。 这符合您如何start_link/0函数的定义。

另一种方法是在你的情况下使用one_for_one并开始了自己的ChildSpec每个孩子。 更复杂也更灵活。

不幸的是这种双重用途的supervisor:start_child/2已经使其成为它的参数不一致。



文章来源: Erlang - Starting a child from the supervisor module
标签: erlang otp