Erlang simple_one for_one supervisor不重新启动子级
我有一个测试模块和一个简单的一对一管理者 test.erlErlang simple_one for_one supervisor不重新启动子级,erlang,otp,erlang-supervisor,fault-tolerance,Erlang,Otp,Erlang Supervisor,Fault Tolerance,我有一个测试模块和一个简单的一对一管理者 test.erl -module(test). -export([ run/1, do_job/1 ]). run(Fun) -> test_sup:start_child([Fun]). do_job(Fun) -> Pid = spawn(Fun), io:format("started ~p~n", [Pid]), {ok, Pid}. 测试辅助设备 -module(test_s
-module(test).
-export([
run/1,
do_job/1
]).
run(Fun) ->
test_sup:start_child([Fun]).
do_job(Fun) ->
Pid = spawn(Fun),
io:format("started ~p~n", [Pid]),
{ok, Pid}.
测试辅助设备
-module(test_sup).
-behaviour(supervisor).
-export([start_link/0]).
-export([init/1]).
-export([start_child/1]).
start_link() ->
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
init(_Args) ->
SupFlags = #{strategy => simple_one_for_one, intensity => 2, period => 20},
ChildSpecs = [#{id => test,
start => {test, do_job, []},
restart => permanent,
shutdown => brutal_kill,
type => worker,
modules => [test]}],
{ok, {SupFlags, ChildSpecs}}.
start_child(Args) ->
supervisor:start_child(?MODULE, Args).
我通过命令test\u sup:start\u link()
在shell中启动supervisor。之后,我运行这个命令:test:run(fun()->erlang:throw(err)end)。
i除了函数do\u job
restart 2次之外,它从未重新启动过。有什么问题
这是shell:
1> test_sup:start_link().
{ok,<0.36.0>}
2> test:run(fun() -> erlang:throw(err) end).
started <0.38.0>
{ok,<0.38.0>}
3>
=ERROR REPORT==== 16-Dec-2016::22:08:41 ===
Error in process <0.38.0> with exit value:
{{nocatch,err},[{erlang,apply,2,[]}]}
1>测试:启动链接()。
{好的,}
2> 测试:运行(fun()->erlang:throw(err)end)。
起动
{好的,}
3>
=错误报告===2016年12月16日::22:08:41===
使用退出值处理时出错:
{{nocatch,err},[{erlang,apply,2,[]}
重新启动子系统与简单的一对一管理器的定义相反。根据:
函数delete_child/2和restart_child/2对于简单_one_for_one主管无效,如果指定的主管使用此重新启动策略,则返回{error,simple_one_for_one}
换句话说,你所要求的永远不会发生。这是因为simple\u one\u for\u one
用于动态子级,动态子级是通过在请求子级时传入额外的启动参数来定义的。其他主管可以重新启动其子级,因为启动参数是在主管中静态定义的
基本上,这种类型的主管严格来说是为了确保在需要有一个动态的员工池时能够有序地关闭