5

假设我有一个主管,我需要start_child为这个主管执行一些。我必须先启动所有启动我的主管吗?或者我只能supervisor:start_child(my_sup,[])在没有 my_sup 的情况下启动?

4

2 回答 2

4

首先,您创建一个监督进程作为监督树调用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, ...}是一个子规范,它是这样定义的:

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

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

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

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

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

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

于 2011-01-28T19:32:33.157 回答
0

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

于 2016-03-24T22:40:07.043 回答