Question

J'ai une question au sujet de superviseur. Par exemple, j'ai 1 superviseur et je dois exécuter des start_child pour ce superviseur. Dois-je commencer d'abord commencer mon superviseur? Ou puis-je seulement supervisor:start_child(my_sup,[]) sans my_sup à partir?

Merci.

Était-ce utile?

La solution

Tout d'abord, vous créez un processus de superviseur dans le cadre d'un arbre de supervision appelant supervisor:start_link/2 ou supervisor:start_link/3 . Le superviseur créé appels de processus Module:init/1 pour en savoir plus sur la stratégie de redémarrage, la fréquence de redémarrage maximum et les spécifications de l'enfant.

Ceci est l'exemple de code pour un superviseur de départ gen_server (cependant, vous peut commencer à d'autres modules 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]}]}}.

Le tuple {ch3, ...} est une spécification enfant , qui est défini cette façon:

{Id, StartFunc, Restart, Shutdown, Type, Modules}

La spécification de l'enfant pour démarrer le serveur ch3 dans l'exemple ci-dessus ressemble à:

{ch3, {ch3, start_link, []}, permanent, brutal_kill, worker, [ch3]}

Dans l'exemple, vous voyez que ch3 du module sera lancé, contrôlé et arrêté par le superviseur, vous voyez aussi one_for_one restart spécifié qui est généralement utilisé. one_for_one dans les moyens de spécification de l'enfant que si un processus enfant se termine et devrait être remis en marche, que ce processus de l'enfant est affecté, ce qui est probablement votre cas. Vos processus enfants sont mis en marche, suivis, redémarrer et arrêter automatiquement par le superviseur.

start_child/2 est utilisé pour ajouter dynamiquement une spécification enfant le superviseur SupRef qui démarre le processus d'enfant correspondant.

Ainsi supervisour démarre toujours d'abord, puis ses processus enfants sont démarrés automatiquement ou manuellement en fonction des stratégies de redémarrage .

Autres conseils

Oui, vous devez d'abord démarrer le superviseur parce que vous ne serez pas commencer l'enfant depuis le superviseur est celui qui commence l'enfant. J'espère que ça aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top