Frage

Wo kann ich ein Beispiel finden, wie Sie einem vorhandenen Vorgesetzten dynamische Kinderprozesse hinzufügen (simple_one_for_one Strategie neu starten)?

War es hilfreich?

Lösung

Ich habe einige Nachforschungen angestellt und unten habe ich.

Erstens ist dies ein Beispiel -Rückrufmodul eines Vorgesetzten:

-module(root_sup).
-behaviour(supervisor).
-export([start_link/0]).
-export([init/1]).

start_link() ->
     {ok, Pid} = supervisor:start_link({local, ?MODULE}, 
          ?MODULE, []),
     {ok, Pid}.

init(_Args) ->
     RestartStrategy = {simple_one_for_one, 10, 60},
     ChildSpec = {ch1, {ch1, start_link, []},
          permanent, brutal_kill, worker, [ch1]},
     Children = [ChildSpec],
     {ok, {RestartStrategy, Children}}.

Und dies ist ein Rückrufmodul eines Kindes, das dem Suprervision -Baum dynamisch hinzugefügt wird:

-module(ch1).

-behaviour(gen_server).

% Callback functions which should be exported
-export([init/1]).
-export([handle_cast/2]).

% user-defined interface functions
-export([start_link/0]).

start_link() ->
     gen_server:start_link(?MODULE, [], []).

init(_Args) ->
     io:format("ch1 has started (~w)~n", [self()]),
     % If the initialization is successful, the function
     % should return {ok,State}, {ok,State,Timeout} ..
     {ok, ch1State}.

handle_cast(calc, State) ->
     io:format("result 2+2=4~n"),
     {noreply, State};
handle_cast(calcbad, State) ->
     io:format("result 1/0~n"),
     1 / 0,
     {noreply, State}.

So beginnen wir normalerweise den Vorgesetzten:

1> ch_sup:start_link().
{ok,<0.33.0>}

Beginnen wir jetzt unseren ersten Kinderprozess:

2> {ok, Child1Pid} = supervisor:start_child(ch_sup, []).
ch1 has started (<0.35.0>)
{ok,<0.35.0>}

Sie können dynamisch Kinderprozesse starten. Beginnen wir ein anderes Kind:

3> {ok, Child2Pid} = supervisor:start_child(ch_sup, []).
ch1 has started (<0.37.0>)
{ok,<0.37.0>}

Sie können sehen, dass unsere Prozesse begonnen haben (beachten Sie die letzten beiden):

4> erlang:processes().
[<0.0.0>,<0.2.0>,<0.4.0>,<0.5.0>,<0.7.0>,<0.8.0>,<0.9.0>,
 <0.10.0>,<0.11.0>,<0.12.0>,<0.13.0>,<0.14.0>,<0.15.0>,
 <0.16.0>,<0.17.0>,<0.18.0>,<0.19.0>,<0.20.0>,<0.21.0>,
 <0.22.0>,<0.23.0>,<0.24.0>,<0.25.0>,<0.26.0>,<0.27.0>,
 <0.31.0>,<0.33.0>,<0.35.0>,<0.37.0>]

Lassen Sie uns nun unseren ersten Kinderprozess etwas tun:

5> gen_server:cast(Child1Pid, calc).
result 2+2=4
ok

So weit, ist es gut. Jetzt machen wir unser erstes Kind, um einen schlechten Code zu bewerten:

6> gen_server:cast(Child1Pid, calcbad).
result 1/0
ok    
7> 
=ERROR REPORT==== 10-Feb-2011::01:32:15 ===
** Generic server <0.35.0> terminating 
** Last message in was {'$gen_cast',calcbad}
** When Server state == ch1State
** Reason for termination == 
** {'function not exported',
       [{ch1,terminate,
            [{badarith,
                 [{ch1,handle_cast,2},
                  {gen_server,handle_msg,5},
                  {proc_lib,init_p_do_apply,3}]},
             ch1State]},
        {gen_server,terminate,6},
        {proc_lib,init_p_do_apply,3}]}
ch1 has started (<0.42.0>)
7>

In dem Bericht können Sie sehen, dass die Aufteilung durch Null eine Ausnahme verursacht und der Prozess beendet wurde. Aber der Vorgesetzte kümmert sich darum und startet sofort einen anderen Kinderprozess (beachten Sie die letzte Zeile).

Wir können überprüfen, ob der andere Kinderprozess, den wir zuvor begonnen haben, noch am Leben ist (Hinweis <0.37.0>):

7> erlang:processes().                 
[<0.0.0>,<0.2.0>,<0.4.0>,<0.5.0>,<0.7.0>,<0.8.0>,<0.9.0>,
 <0.10.0>,<0.11.0>,<0.12.0>,<0.13.0>,<0.14.0>,<0.15.0>,
 <0.16.0>,<0.17.0>,<0.18.0>,<0.19.0>,<0.20.0>,<0.21.0>,
 <0.22.0>,<0.23.0>,<0.24.0>,<0.25.0>,<0.26.0>,<0.27.0>,
 <0.31.0>,<0.33.0>,<0.37.0>,<0.42.0>]
8>

Wir können es sogar dazu bringen, etwas für uns zu tun:

8> gen_server:cast(Child2Pid, calc).   
result 2+2=4
9>

Im Folgenden finden Sie die Erlang -Handbuchseiten, die Sie lesen möchten:

Andere Tipps

Im Supervisorverhalten Abschnitt der OTP -Designprinzipien Teil der Erlang -Dokumente Es gibt ein Beispiel für die Verwendung simple_one_for_one und dynamische Kinder. Ich empfehle den Teil des gesamten Designprinzipien, da es viel Einblick in die Funktionsweise von OTP bietet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top