我有一个Erlang应用程序,主管启动了gen_server。生成的gen_server在其init / 1中具有逻辑,以将新进程挂接到主管。当它只需执行此操作时,
supervisor:start_child(supervisor_name, Child_spec),
在init / 1内部,应用程序挂起。但是如果我使用
rpc:cast(node(), supervisor, start_child, [supervisor_name, Child_spec]),
然后应用程序运行平稳。任何人都可以给我一些想法来调试这种情况,或者非常感谢您的见解。
发生这种情况是因为主管接连地启动其子进程,等待每个子进程完成初始化,然后再生成下一个进程。
也就是说,主管已获得gen_server模块的启动功能,类似于{my_module, start_link, []}
。它要等到该函数返回,然后再不处理其他任何请求。my_module:start_link/0
Calls gen_server:start_link/4
,仅在回调函数my_module:init/1
返回后才返回。
但是,my_module:init/1
由于主管正在等待my_module:init/1
返回,因此向主管发出了阻塞呼叫,而主管此时并没有期望,这会导致死锁。
它起作用的原因rpc:cast
是rpc:cast
不等待函数返回,因此没有死锁。
您是否需要在gen_serverinit
回调函数中添加新的子规范?您可以将两个子规范都添加到您的主管init
功能中,然后将它们一个接一个地启动。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句