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
函数中添加两个子规范,它们将一个接一个地启动。
我有一个 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
函数中添加两个子规范,它们将一个接一个地启动。