主管是否需要开始自己的主管?

0xA*_*xAX 5 erlang erlang-otp erlang-supervisor

假设我有一个主管,我需要start_child为这个主管执行一些。我必须先启动所有启动我的主管吗?或者我可以supervisor:start_child(my_sup,[])不启动 my_sup 吗?

Yas*_*aev 4

supervisor:start_link/2首先,您创建一个监督进程,作为调用或 的监督树的一部分supervisor:start_link/3。创建的supervisor进程调用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]}]}}.
Run Code Online (Sandbox Code Playgroud)

元组{ch3, ...}是一个子规范,其定义如下:

{Id, StartFunc, Restart, Shutdown, Type, Modules}
Run Code Online (Sandbox Code Playgroud)

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

{ch3, {ch3, start_link, []}, permanent, brutal_kill, worker, [ch3]}
Run Code Online (Sandbox Code Playgroud)

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

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

因此,supervisor 总是首先启动,然后根据重启策略自动或手动启动其子进程。