我对主管有疑问。例如,我有一个主管,我需要为这个主管执行一些start_child。我必须首先开始我的主管吗?或者我可以{my}只启动supervisor:start_child(my_sup,[])
吗?
谢谢。
答案 0 :(得分:3)
首先,您创建一个主管流程,作为监督树的一部分,呼叫supervisor:start_link/2
或supervisor: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)
是的,你应该首先启动主管,因为你不会启动孩子,因为主管是启动孩子的主管。希望能帮助到你。