Erlang主管和主管孩子

时间:2011-01-28 18:28:12

标签: erlang otp supervisor

我对主管有疑问。例如,我有一个主管,我需要为这个主管执行一些start_child。我必须首先开始我的主管吗?或者我可以{my}只启动supervisor:start_child(my_sup,[])吗?

谢谢。

2 个答案:

答案 0 :(得分:3)

首先,您创建一个主管流程,作为监督树的一部分,呼叫supervisor:start_link/2supervisor:start_link/3。创建的主管进程调用Module:init/1以了解重启策略,最大重启频率和子规范。

这是从gen_server开始的主管的示例代码(但是,您可以启动其他gen_ *模块):

-module(ch_sup).
-behaviour(supervisor).
-export([start_link/0]).
-export([init/1]).
start_link() ->
    supervisor:start_link(ch_sup, []).
init(_Args) ->
    {ok, {{one_for_one, 1, 60},
          [{ch3, {ch3, start_link, []},
            permanent, brutal_kill, worker, [ch3]}]}}.

元组{ch3, ...}child specification,以这种方式定义:

{Id, StartFunc, Restart, Shutdown, Type, Modules}

在上面的示例中,启动服务器ch3的子规范如下所示:

{ch3, {ch3, start_link, []}, permanent, brutal_kill, worker, [ch3]}

从示例中您可以看到模块ch3将由主管启动,监控和停止,您还会看到指定的one_for_one restart strategy通常使用。子规范中的one_for_one表示如果一个子进程终止并且应该重新启动,则只有该子进程受到影响,这可能就是您的情况。您的子进程由主管自动启动,监视,重新启动和停止。

start_child/2用于向启动相应子进程的主管SupRef动态添加子规范。

因此,首先始终启动监督,然后根据重启策略自动或手动启动子流程。

答案 1 :(得分:0)

是的,你应该首先启动主管,因为你不会启动孩子,因为主管是启动孩子的主管。希望能帮助到你。