Erlang:使用supervisor:start\u child/2在gen\u服务器:init/1中添加新的子级将挂起应用程序

Erlang:使用supervisor:start\u child/2在gen\u服务器:init/1中添加新的子级将挂起应用程序,erlang,otp,erlang-supervisor,gen-server,Erlang,Otp,Erlang Supervisor,Gen Server,我有一个Erlang应用程序,由主管启动gen_服务器。派生的gen_服务器在其init/1中具有将新进程挂接到主管的逻辑。 当它只需要 supervisor:start_child(supervisor_name, Child_spec), 在init/1内部,应用程序挂起。但是如果我用 rpc:cast(node(), supervisor, start_child, [supervisor_name, Child_spec]), 然后应用程序就可以顺利运行了。任何人都可以给我一些想法来

我有一个Erlang应用程序,由主管启动gen_服务器。派生的gen_服务器在其init/1中具有将新进程挂接到主管的逻辑。 当它只需要

supervisor:start_child(supervisor_name, Child_spec),
在init/1内部,应用程序挂起。但是如果我用

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

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

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

也就是说,主管被赋予gen_服务器模块的启动功能,类似于
{my_module,start_link,[]}
。它将等待该函数返回,同时不处理任何其他请求
my_模块:start_-link/0
调用
gen_服务器:start_-link/4
,仅在回调函数
my_模块:init/1
返回时返回

但是,
my_module:init/1
向主管发出阻塞调用,主管此时不希望这样做,因为它正在等待
my_module:init/1
返回,而您遇到了死锁

它使用
rpc:cast
的原因是
rpc:cast
不等待函数返回,因此不存在死锁



是否需要在gen_server
init
回调函数中添加新的子规范?您只需在supervisor
init
函数中添加两个子规范,它们就会一个接一个地启动。

我需要决定是否挂接第二个进程。或者需要从第一个进程的init/1向第二个进程传递一些参数。但是,如何了解Erlang应用程序中的这种死锁情况呢?有办法吗?谢谢