2016-12-16 3 views
0

Ich habe ein Testmodul und ein simple_one_for_one Supervisor.Eralng simple_one_for_one Supervisor startet Kind nicht neu

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}. 

test_sup.erl

-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). 

I Supervisor in der Schale test_sup:start_link() durch Befehl starten. Danach starte ich diesen Befehl: test:run(fun() -> erlang:throw(err) end). Ich außer der Funktion do_job Neustart 2mal aber es tut es nie. Was ist das Problem?

Hier 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,[]}]} 

Antwort

2

Neustarten Kinder steht im Gegensatz zu wie simple_one_for_one Vorgesetzte definiert sind. Per der supervisor docs:

Funktionen delete_child/2 und restart_child/2 ungültig sind für simple_one_for_one Vorgesetzte und Rückkehr {Fehler, simple_one_for_one}, wenn der angegebene Supervisor diesen Neustart Strategie verwendet.

Mit anderen Worten, was Sie verlangen, kann nie passieren. Das liegt daran, dass eine simple_one_for_one für dynamische untergeordnete Elemente gedacht ist, die während der Übergabe definiert werden, indem zusätzliche Startargumente übergeben werden, wenn Sie das untergeordnete Element anfordern. Andere Supervisors können ihre untergeordneten Objekte neu starten, da die Startroutinen im Supervisor statisch definiert sind.

Grundsätzlich ist diese Art von Supervisor ausschließlich für ein sauberes Herunterfahren, wenn Sie einen dynamischen Pool von Arbeitern benötigen.

Verwandte Themen