Erlang:使用supervisor在gen_server:init / 1中添加新子节点:start_child / 2将挂起应用程序

时间:2017-02-10 10:26:37

标签: erlang otp supervisor gen-server

我有一个Erlang应用程序,主管启动gen_server。生成的gen_server在其init / 1中具有逻辑,以将新进程挂钩到管理程序。 当它用just,

执行此操作时
supervisor:start_child(supervisor_name, Child_spec),

在init / 1内部,应用程序挂断了。但如果我使用,

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

然后应用程序运行顺利。任何人都可以给我一些想法来调试这种情况,或者非常感谢洞察力。

1 个答案:

答案 0 :(得分:2)

这是因为主管一个接一个地启动子进程,等待每个进程完成初始化,然后生成下一个进程。

也就是说,管理员被赋予gen_server模块的启动功能,例如{my_module, start_link, []}。它将等到该函数返回,同时不处理任何其他请求。 my_module:start_link/0调用gen_server:start_link/4,只有在回调函数my_module:init/1返回后才会返回。{/ p>

但是,my_module:init/1会对主管进行阻止调用,主管此时并不期待,因为它正在等待my_module:init/1返回 - 而且您遇到了死锁。

它与rpc:cast一起使用的原因是rpc:cast不等待函数返回,因此没有死锁。

您是否需要在gen_server init回调函数中添加新的子规范?您可以在主管init功能中添加两个子规范,它们将一个接一个地启动。