我不确定我能否恰当地表达我的问题,但我会尽我所能。
我发现你必须设置一个主管树(sup,sup-tress和其他更复杂的树)的方式很尴尬。
让我们举例说明以下内容(我已经制作了这些示例并对其进行了扩展):http://learnyousomeerlang.com/supervisors
我不喜欢启动我的应用程序(管理程序树)的想法,然后必须在shell上发送erl命令以使应用程序按照我想要的方式运行。从网站上获取底壳示例:
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进一步输入其他命令以获得我想要的东西。
对于一个真实世界的例子,比方说,我有一个听取监督员,在这个主管上,我说我想要总共有100名听力工作者。他们的工作是监听Listen Supervisor创建的套接字。鉴于教程(和其他人在线),我将不得不输入shell 100次以启动所有孩子。
所以,我想我的问题是以下......
如何在应用程序或主管中完成所有这些操作(但是你想要这样做),这样在启动你的光束文件后就不需要在shell中输入任何内容了。
我知道必须有办法,但我无法想出一个足够好的架构,让我这样做是一种标准而干净的方式。
感谢您的时间。
答案 0 :(得分:1)
你有一些选择。
您可以在env
of .app file或sys.config file中定义一些变量,并在主管的init/1
中获取这些变量,并返回足够数量的childspecs。
如果孩子的数量和其他信息来自其他代码并且他们可能来自不同的时间,您可以在主管中有一个名为dispatcher
的孩子,您的调度员的职责是获取有关启动孩子和启动他们的信息作为主管的孩子。