假设我有一个主管,我需要start_child
为这个主管执行一些。我必须先启动所有启动我的主管吗?或者我只能supervisor:start_child(my_sup,[])
在没有 my_sup 的情况下启动?
问问题
3890 次
2 回答
4
首先,您创建一个监督进程作为监督树调用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, ...}
是一个子规范,它是这样定义的:
{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 回答