comportement des superviseurs
-
28-10-2019 - |
Question
la mise en œuvre d'un superviseur .. Si, dans le module de superviseur, je fais quelque chose comme
init ([_]) ->
{Ok,
{{One_for_one, 5, 60},
[{Reverese, {inverse, start_reverse, []}, permanent, brutal_kill, travailleur, []}]}}.
et la fonction inverse est:
start_reverse () ->
Pid = frai (? MODULE inverse, []).
Il ne fonctionnera pas depuis la sortie de la fonction start_reverse normalement dans tous les cas. Cependant, quand j'ajoute une ligne comme ceci:
start_reverse () ->
Pid = spawn (? MODULE, inverse, []),
{Ok,} Pid.
Il fonctionne, même lorsque la fonction sort normalement aussi bien. Quelqu'un peut-il expliquer pourquoi?
La solution
En fait .. Il n'est pas vraiment nécessaire pour le processus enfant superviseur pour un gen_server
. Le superviseur documentation mentionne expressément que
La fonction de démarrage doit créer et lien vers le processus de l'enfant, et doit retourner {ok, Enfant} ou {ok, Enfant, Info} où l'enfant est le pid du processus des enfants et des informations un terme arbitraire qui est ignoré par le superviseur.
qui est la raison pour laquelle lorsque vous êtes revenu {ok, Pid}
il a travaillé ..
Autres conseils
facilement,
Le problème est que le supervisor
a besoin d'une convention d'appel spécifique pour soutenir l'arrêt et l'initialisation des processus. Votre code avec un spawn
bas niveau ne tient pas compte de cette convention. Vous devez soit
- Utilisez un comportement gen_something,
gen_server
est le plus courant. - Spawn le processus en utilisant
proc_lib
- Utilisez un
supervisor_bridge
Dans le cas contraire, votre code ne profitera pas du Bureau du Procureur du tout. Et vous le souhaitez.