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?

Était-ce utile?

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.

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