Erlang 用简单的“一个”为“一个主管”培养孩子

Erlang 用简单的“一个”为“一个主管”培养孩子,erlang,otp,Erlang,Otp,你如何让一个孩子从simple\u one\u for\u onesupervisor开始? 我正在阅读LYSE的书,目前在动态监控部分: 作者以如下方式开始孩子,但我不知道djembe是在哪里定义的: 1> supervisor:start_child(band_supervisor, [djembe, good]). Musician Janet Tennelli, playing the djembe entered the room {ok,<0.690.0>} 2&g

你如何让一个孩子从
simple\u one\u for\u one
supervisor开始? 我正在阅读LYSE的书,目前在动态监控部分:

作者以如下方式开始孩子,但我不知道
djembe
是在哪里定义的:

1> supervisor:start_child(band_supervisor, [djembe, good]).
Musician Janet Tennelli, playing the djembe entered the room
{ok,<0.690.0>}
2> supervisor:start_child(band_supervisor, [djembe, good]).
{error,{already_started,<0.690.0>}}
以下是音乐家:

-module(musicians).
-behaviour(gen_server).

-export([start_link/2, stop/1]).
-export([init/1, handle_call/3, handle_cast/2,
         handle_info/2, code_change/3, terminate/2]).

-record(state, {name="", role, skill=good}).
-define(DELAY, 750).

start_link(Role, Skill) ->
    gen_server:start_link({local, Role}, ?MODULE, [Role, Skill], []).

stop(Role) -> gen_server:call(Role, stop).

init([Role, Skill]) ->
    %% To know when the parent shuts down
    process_flag(trap_exit, true),
    %% sets a seed for random number generation for the life of the process
    %% uses the current time to do it. Unique value guaranteed by now()
    random:seed(now()),
    TimeToPlay = random:uniform(3000),
    Name = pick_name(),
    StrRole = atom_to_list(Role),
    io:format("Musician ~s, playing the ~s entered the room~n",
              [Name, StrRole]),
    {ok, #state{name=Name, role=StrRole, skill=Skill}, TimeToPlay}.

handle_call(stop, _From, S=#state{}) ->
    {stop, normal, ok, S};
handle_call(_Message, _From, S) ->
    {noreply, S, ?DELAY}.

handle_cast(_Message, S) ->
    {noreply, S, ?DELAY}.

handle_info(timeout, S = #state{name=N, skill=good}) ->
    io:format("~s produced sound!~n",[N]),
    {noreply, S, ?DELAY};
handle_info(timeout, S = #state{name=N, skill=bad}) ->
    case random:uniform(5) of
        1 ->
            io:format("~s played a false note. Uh oh~n",[N]),
            {stop, bad_note, S};
        _ ->
            io:format("~s produced sound!~n",[N]),
            {noreply, S, ?DELAY}
    end;
handle_info(_Message, S) ->
    {noreply, S, ?DELAY}.

code_change(_OldVsn, State, _Extra) ->
    {ok, State}.

terminate(normal, S) ->
    io:format("~s left the room (~s)~n",[S#state.name, S#state.role]);
terminate(bad_note, S) ->
    io:format("~s sucks! kicked that member out of the band! (~s)~n",
              [S#state.name, S#state.role]);
terminate(shutdown, S) ->
    io:format("The manager is mad and fired the whole band! "
              "~s just got back to playing in the subway~n",
              [S#state.name]);
terminate(_Reason, S) ->
    io:format("~s has been kicked out (~s)~n", [S#state.name, S#state.role]).

%% Yes, the names are based off the magic school bus characters
%% 10 names!
pick_name() ->
    %% the seed must be set for the random functions. Use within the
    %% process that started with init/1
    lists:nth(random:uniform(10), firstnames())
    ++ " " ++
    lists:nth(random:uniform(10), lastnames()).

firstnames() ->
    ["Valerie", "Arnold", "Carlos", "Dorothy", "Keesha",
     "Phoebe", "Ralphie", "Tim", "Wanda", "Janet"].

lastnames() ->
    ["Frizzle", "Perlstein", "Ramon", "Ann", "Franklin",
     "Terese", "Tennelli", "Jamal", "Li", "Perlstein"].

learnyousomeerlang.com
是一个很好的信息来源,但有时我觉得它太复杂了。我通过阅读文档直接了解了OTP的这一部分。如果您只想了解动态子项,则可能不需要
genu服务器。见:

其中动态子名称
estp_项目:server_name/1
的创建方式如下:

server_name(Name) ->
    Module = atom_to_binary(?MODULE, utf8),
    Binary = atom_to_binary(Name, utf8),
    binary_to_atom(<<Module/binary, <<"$">>/binary, Binary/binary>>, utf8).
然后,只需调用
estp\u proj\u sup:add(Name,Cfg)
即可添加子项,如:

过程(Res)->
%%Res包含项目名称及其配置的解析列表
[set_project(Name,Cfg)|{Name,{ok,Cfg}
案例estp项目支持:添加(名称,Cfg)
{ok,{U Pid}->ok;
{error,{}=Err->Err
结束。
不管怎样,我试过你的例子,它似乎是有效的:

4> {ok, S} = band_supervisor:start_link(jamband).
{ok,<0.47.0>}
5> supervisor:start_child(band_supervisor, [djembe, good]).
Musician Wanda Terese, playing the djembe entered the room
{ok,<0.49.0>}
Wanda Terese produced sound!
Wanda Terese produced sound!
Wanda Terese produced sound!
Wanda Terese produced sound!
Wanda Terese produced sound!
6> supervisor:start_child(band_supervisor, [djembe, good]).
{error,{already_started,<0.49.0>}}
Wanda Terese produced sound!
Wanda Terese produced sound!
4>{ok,S}=band\u主管:启动链接(jamband)。
{好的,}
5> 主管:启动儿童(乐队主管,[djembe,good])。
音乐家万达·特蕾丝演奏着吉姆贝音乐走进了房间
{好的,}
万达·特蕾丝发出了声音!
万达·特蕾丝发出了声音!
万达·特蕾丝发出了声音!
万达·特蕾丝发出了声音!
万达·特蕾丝发出了声音!
6> 主管:启动儿童(乐队主管,[djembe,good])。
{错误,{已启动,}
万达·特蕾丝发出了声音!
万达·特蕾丝发出了声音!

奇怪,现在可以用了。一定是搞错了。无论如何,谢谢。
-module(estp_proj_sup).
-behaviour(supervisor).

%% API
-export([start_link/0]).

%% Supervisor callbacks
-export([init/1, add/2]).

-define(SERVER, ?MODULE).

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

init([]) ->
    Child = ?WORKER(estp_project),
    {ok, {{simple_one_for_one, 3, 30}, [Child]}}.

add(Name, Cfg) ->
    Server = estp_project:server_name(Name),
    State = [{name, Name}|Cfg],
    case whereis(Server) of
        undefined ->
            add_child(Server, State);
        Pid ->
            delete_child(Server, Pid),
            add_child(Server, State)
    end.

add_child(Server, State) ->
    supervisor:start_child(?SERVER, [Server, State]).

delete_child(Server, Pid) ->
    ok = supervisor:terminate_child(?SERVER, Pid).
server_name(Name) ->
    Module = atom_to_binary(?MODULE, utf8),
    Binary = atom_to_binary(Name, utf8),
    binary_to_atom(<<Module/binary, <<"$">>/binary, Binary/binary>>, utf8).
-define(SHUTDOWN_TIMEOUT, 5000).
-define(WORKER(I), {I, {I, start_link, []}, permanent, ?SHUTDOWN_TIMEOUT, worker, [I]}).
process(Res) ->
    %% Res contains parsed list of project names and their configurations
    [set_project(Name, Cfg) || {Name, {ok, Cfg}} <- Res].

set_project(Name, Cfg) ->
    case estp_proj_sup:add(Name, Cfg) of
        {ok, _Pid} -> ok;
        {error, _} = Err -> Err
    end.
4> {ok, S} = band_supervisor:start_link(jamband).
{ok,<0.47.0>}
5> supervisor:start_child(band_supervisor, [djembe, good]).
Musician Wanda Terese, playing the djembe entered the room
{ok,<0.49.0>}
Wanda Terese produced sound!
Wanda Terese produced sound!
Wanda Terese produced sound!
Wanda Terese produced sound!
Wanda Terese produced sound!
6> supervisor:start_child(band_supervisor, [djembe, good]).
{error,{already_started,<0.49.0>}}
Wanda Terese produced sound!
Wanda Terese produced sound!