2011-11-11 49 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系統彼此相鄰,而不是單獨運行一個,然後處理其中的多個域。

相關問題