Erlang: superviseurs en cascade?
-
11-09-2019 - |
Question
Est-il possible de cascade superviseurs dans une application?
par exemple. superviseur sup1
fraie un processus enfant qui crée un sup2
superviseur?
La solution
Vous voulez probablement ajouter l'enfant en tant que superviseur.
Il est une entrée dans le childspec d'un enfant d'un superviseur. Le « type » de l'enfant peut être réglé à « superviseur »:
http://www.erlang.org/doc/design_principles/sup_princ .html # spec
Probablement, vous pouvez le faire par l'enfant à partir d'un superviseur lui-même aussi, mais il est au moins moins élégant et il est moins évident ce que vous faites.
HTH, h.
Autres conseils
Oui, vous pouvez simplement ajouter les superviseurs comme les enfants d'un superviseur. Ou mélanger et assortir. Je fais quelque chose comme ça habituellement:
(dans mon superviseur de niveau supérieur)
init([]) ->
Args = [],
ModuleArray = [get_info(Module, Args)
|| Module
<- [emx_nodestate, emx_sup_data, emx_sup_util, emx_sup_api,
emx_flow]],
{ok, {{one_for_one, 3, 1}, ModuleArray}}.
get_info(Module, Args) ->
{Module, {Module, start_link, [Args]}, permanent, 10000,
worker, [Module]}.
Et puis quelque chose comme emx_sup_data (superviseur de comportement) contient:
init([]) ->
Args = [],
ModuleArray = [get_info(Module, Args)
|| Module <- [job_housekeep]],
{ok, {{one_for_all, 3, 1}, ModuleArray}}.
get_info(Module, Args) ->
{Module, {Module, start_link, [Args]}, permanent, 10000,
worker, [Module]}.
et quelque chose comme emx_nodestate (comportement gen_server)
init([]) ->
{ok, #state{status=starting, interested=[]}}.
fonctionne comme un rêve ...!
Pour voir comment d'autres gens structurent leurs applications pourquoi ne pas vous lancez un shell et exécutez la barre d'outils:
toolbar:start()
Cela vous donne une vue graphique d'un superviseur heirarchy. Un coup d'œil sur l'arbre superviseur du noyau, ou mnesia ou pian, va vous montrer ce qu'est un arbre superviseur « normal » ressemble.
Vous rédigez une demande de sous-systèmes supervisés par un superviseur d'application. Chaque sous-système peut être beaucoup de sous-sous-systèmes dans le cadre du superviseur sous-système (continuer à appliquer modèle de manière fonctionnelle récursive jusqu'à ce que vous manquez de granularité ...)