主管需要自己开主管吗?

问题描述 投票:5回答:2

比如说我有一个主管,我需要执行一些 start_child 为这个主管。我必须先启动所有的启动主管吗?还是我只能 supervisor:start_child(my_sup,[]) 而不启动my_sup?

erlang otp erlang-supervisor
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]}]}}.

tuple {ch3, ...} 是一个 子项规格,它是这样定义的。

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

启动服务器的子规范 ch3 在上面的例子中是这样的。

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

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

start_child/2 是用来动态添加一个子规范到supervisor SupRef 来启动相应的子进程。

因此,监督程序总是先被启动,然后它的子进程会根据 重启策略.


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.