我有一个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]),
然后应用程序运行顺利。任何人都可以给我一些想法来调试这种情况,或者非常感谢洞察力。
答案 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
功能中添加两个子规范,它们将一个接一个地启动。