3

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

-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 启动主管很容易:supervisor:start_child(?SERVER, [Id])。我该如何申请?如何使用不同的 ID 启动多个同名应用程序(这样我可以访问同一个 .app 文件)(这样我就可以使用 supervisor:start_child(?SERVER, [Id]) 启动我的孩子)?

如果我的问题不够清楚,这是我的代码。因此,目前,es_simulator_dispatcher启动es_simulator_sup。我想要这个:es_simulator_dispatcher 启动 es_simulator_app 启动 es_simulator_sup。这里的所有都是它的 :-)

在此先感谢,dijxtra

4

2 回答 2

3

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

我建议阅读OTP 设计原则用户指南,了解 OTP 组件的描述、它们之间的关系以及它们的用途。

于 2011-11-14T21:33:47.253 回答
1

我不认为应用程序意味着您想要的动态构造。我会制作一个应用程序,因为在 Erlang 中,应用程序是代码包,而不是正在运行的进程包(您可以说它们是编译时的工件,而不是运行时的工件)。

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

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

于 2011-11-14T10:48:04.770 回答