superviseur Erlang et de l'enfant superviseur
-
27-10-2019 - |
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.
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
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.