Erlang 如何设置自包含的主管树应用程序

Erlang how to set up a supervisor tree application that is self contained

我不确定我是否可以正确表达我的问题,但我会尽力而为。

我发现设置主管树(sup、sup-tress 和其他更复杂的树)的方式很尴尬。

让我们以下面的例子为例(我已经做了这些例子并对其进行了扩展):http://learnyousomeerlang.com/supervisors

我不喜欢启动我的应用程序(监督树),然后必须在 shell 上发送 erl 命令以使应用程序按照我想要的方式运行的想法。从站点中获取底部 shell 示例:

1> supervisor:start_child(band_supervisor, [djembe, good]).
Musician Janet Tennelli, playing the djembe entered the room
{ok,<0.690.0>}
2> supervisor:start_child(band_supervisor, [djembe, good]).
{error,{already_started,<0.690.0>}}
3> supervisor:start_child(band_supervisor, [drum, good]).
Musician Arnold Ramon, playing the drum entered the room
{ok,<0.696.0>}
3> supervisor:start_child(band_supervisor, [guitar, good]).
Musician Wanda Perlstein, playing the guitar entered the room
{ok,<0.698.0>}
4> supervisor:terminate_child(band_supervisor, djembe).
{error,simple_one_for_one}
5> musicians:stop(drum).
Arnold Ramon left the room (drum)
ok

对我来说很奇怪,我必须启动我的主管(或其他),然后通过 shell 进一步输入其他命令以获得我想要的。

举个真实的例子,比方说我有一个 Listen Supervisor,在这个 supervisor 上我说我想要总是有 100 个 listen worker。他们的工作是监听 Listen Supervisor 创建的套接字。鉴于教程(和其他在线教程),我必须输入 shell 100 次才能启动所有子项。

所以,我想我的问题如下...

这一切如何在应用程序或主管中完成(无论你想做什么),以便在启动 beam 文件后无需在 shell 中输入任何内容。

我知道一定有办法,但我只是想不出一个足够好的架构来让我做到这一点是一种标准和干净的方式。

感谢您的宝贵时间。

你有一些选择。

您可以在 env of .app file or in sys.config file 中定义一些变量,并在 init/1 主管和 return 足够数量的 child 规范中获取它们。

如果 children 的计数和有关它们的其他信息来自其他代码,并且它们可能在不同的时间出现,您可以在 supervisor 中有一个名为 dispatcher 的 child,您的调度员的职责是获取有关启动 children 并将其作为主管 child 启动的信息。