2017-02-10 35 views
1

我有一個Erlang應用程序,監控程序啓動gen_server。產生的gen_server在它的init/1中有一個邏輯來掛鉤一個新的進程到管理員。 當它只是做這個操作,Erlang:使用supervisor:start_child/2在gen_server:init/1中添加新的子進程將掛起應用程序

supervisor:start_child(supervisor_name, Child_spec), 

在init/1中的應用程序內掛了。但如果我用,

rpc:cast(node(), supervisor, start_child, [supervisor_name, Child_spec]), 

然後應用程序運行順利。任何人都可以給我一些想法來調試這種情況,或者非常感謝洞察力。

回答

2

發生這種情況是因爲主管人員一個接一個地開始其子進程,等待每個人在產生下一個進程之前完成初始化。

也就是說,主管被賦予gen_server模塊的啓動功能,如{my_module, start_link, []}。它將等到該函數返回,並且不處理任何其他請求。 my_module:start_link/0調用gen_server:start_link/4,只有回調函數my_module:init/1返回時纔會返回。

然而,my_module:init/1使阻塞調用主管,該主管沒有在這一點期待,因爲它在等待my_module:init/1返回 - 和你有一個僵局。

它與rpc:cast的原因是,rpc:cast不會等待函數返回,因此,不存在僵局。


你需要添加新的子規範在gen_server init回調函數?你可以在你的主管init函數中添加兩個子規格,並且他們會一個接一個地開始。

+0

我需要做出是否掛鉤第二個過程的一些決定。或者需要將一些參數從第一個進程的init/1傳遞給第二個進程。但是,如何才能在Erlang應用程序中瞭解這種死鎖情況?有沒有辦法?謝謝。 –