2011-11-11 86 views
3

我有一个启动simple_one_for_one子项的主管。实际上,每个孩子都是拥有自己的树的主管。每个孩子都有一个独特的ID,所以我可以区分它们。Simple_one_for_one应用程序

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

所以,每个gen_server可以轻松地与全球{{标识,MODULE_NAME}} a​​ddresed:每个gen_server然后用START_LINK(同上),其中启动。

现在我想让这个孩子的主管进入申请。所以,我妈妈的主管应该开始申请而不是主管。这应该很简单,除了一部分:将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

回答

4

应用程序不能在其他任何地方运行,它们是最高级别的抽象。当您通过application:start/1启动应用程序时,该应用程序由管理应用程序的应用程序控制器启动。应用程序包含代码和数据,并且可能在运行时监视进程的应用程序。由于应用程序的性质,运行应用程序的多个调用并不是真正有意义的。

我建议您阅读OTP Design Principles User's Guide以了解OTP组件的描述,它们如何关联以及如何使用它们。

+1

是的,你是对的......在Erlang看来,不可能做我想做的事情。可怜。 – dijxtra

1

我不认为这里意味着动态建筑应用,如你想要的。我做了一个单一的应用程序,因为在Erlang中,应用程序比捆绑的正在运行的进程更多的代码包(你可以说它们是编译时的工件,而不是运行时)。

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

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

相关问题