Simple_one_for_one应用程序

时间:2011-11-11 00:56:12

标签: erlang supervisor simple-one-for-one

我有一位主管,负责启动simple_one_for_one孩子。事实上,每个孩子都是一个有自己树的主管。每个孩子都有一个唯一的ID,所以我可以区分它们。然后使用start_link(Id)启动每个gen_server,其中:

-define(SERVER(Id), {global, {Id, ?MODULE}}).
start_link(Id) ->
    gen_server:start_link(?SERVER(Id), ?MODULE, [Id], []).

因此,每个gen_server都可以轻松添加{global,{Id,module_name}}。

现在我想让这个儿童主管进入申请。所以,我的母亲主管应该开始申请而不是主管。这应该是直截了当的,除了一部分:将ID传递给应用程序。使用ID启动主管很简单:主管:start_child(?SERVER,[Id])。我该如何申请?如何启动具有不同ID的同名应用程序(因此我可以访问相同的.app文件)(因此我可以通过主管启动我的孩子:start_child(?SERVER,[Id]))?

如果我的问题不够清楚,这是我的代码。因此,目前es_simulator_dispatcher启动es_simulator_sup。我想要这样:es_simulator_dispatcher启动es_simulator_app,启动es_simulator_sup。这就是它的全部内容: - )

提前致谢, dijxtra

2 个答案:

答案 0 :(得分:3)

应用程序不在其他任何东西下运行,它们是顶级抽象。使用application:start/1启动应用程序时,应用程序由管理应用程序的应用程序控制器启动。应用程序包含代码和数据,并且可能在运行时是运行时执行应用程序 thing 的进程的监督树。由于应用程序的性质,运行应用程序的多个调用并不真正有意义。

我建议阅读OTP Design Principles User's Guide,了解OTP的组成部分,它们之间的关系以及它们的用途。

答案 1 :(得分:1)

我认为应用程序并不像您想要的那样适用于动态构造。我创建了一个单独的应用程序,因为在Erlang中,应用程序是代码捆绑而不是运行进程的捆绑(你可以说它们是编译时的工件,而不是运行时)。

通常通过内置配置系统将配置提供给应用程序。也就是说,您使用application:get_env(Key)来阅读它应该使用的内容。还有一个application:set_env(...)将特定配置提供给一个 - 但首选的方法是磁盘上的配置文件。这可能适用于您的情况,也可能不适用。

从某种意义上说,你要做的就是创建200个Apache配置文件,然后彼此相邻地生成200个Apache系统,而不是运行一个,然后处理其中的多个域。