在我的 Erlang/OTP 应用程序中,我有一个one_for_all
主管 ( sup ) 和几个孩子。其中一个孩子(有行为的child1gen_server
)应该能够向另一个孩子(有行为的child2supervisor
)发送消息。当然,我可以注册它,但用多余的名称堵塞全局范围似乎不是一个好主意。
因此,使这种交互成为可能的唯一方法是为 child1 提供child2的pid。说到做到。有supervisor:wich_children/1
适当功能的调用。只需将sup的 pid 作为参数传递给chidl1,调用which_children
,child1:init
并... 陷入僵局。sup正在等待child1开始,child1正在等待sup子描述:
init(SupPid) ->
Descriptions = supervisor:which_children(SupPid),
... .
这可以通过以下方法解决:
init(SupPid) ->
gen_server:cast(self(), initialize),
... .
handle_cast(initialize, State) ->
Descriptions = supervisor:which_children(SupPid),
... % Generating new state containing desired pid
{noreply, NewState}.
但是,我对这个解决方案并不满意。
问题是:根据 OTP 设计原则,监督树成员之间最常规的交互方式是什么?