Erlang: 在 gen_server:init/1 中添加新的 child using supervisor:start_child/2 will hung up application

Erlang: Add new child within the gen_server:init/1 using supervisor:start_child/2 will hung up application

我有一个 Erlang 应用程序,主管启动了一个 gen_server。 spawned gen_server 在其 init/1 中具有将新进程挂接到主管的逻辑。 当它用

做这个操作时
supervisor:start_child(supervisor_name, Child_spec),

在 init/1 内,应用程序已挂起。但是如果我使用,

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

然后申请运行顺利。谁能给我一些想法来调试这种情况,或者非常感谢您的见解。

发生这种情况是因为监管者一个接一个地启动它的子进程,等待每个子进程完成初始化,然后再产生下一个。

也就是说,supervisor被赋予了你的gen_server模块的启动函数,类似于{my_module, start_link, []}。它将等到该函数 returns,同时不处理任何其他请求。 my_module:start_link/0 调用 gen_server:start_link/4,这将 return 只有一次回调函数 my_module:init/1 returns.

但是,my_module:init/1 对主管进行了阻塞调用,主管此时没有预料到这一点,因为它正在等待 my_module:init/1 到 return - 你有一个死锁。

它与 rpc:cast 一起工作的原因是 rpc:cast 不等待函数到 return,因此没有死锁。


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