one_for_all
监督器(sup)。其中一个子进程(使用gen_server
行为的child1)应该能够向另一个子进程(使用supervisor
行为的child2)发送消息。当然,我可以注册它,但在全局范围内堆积过多名称似乎不是一个好主意。因此,使这种交互成为可能的唯一方法是提供child1的pid给child2。说得容易做起来难。有一个具有适当功能的
supervisor:which_children/1
调用。只需将sup的pid作为参数传递给chidl1,在child1:init
中调用which_children
,然后……陷入僵局。 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设计原则,监管树成员之间的最常规交互方式是什么?
gen_server:cast/2
的代码从init
函数移动到 supervisor 中即可。关于仅用于初始化的消息:可以将其视为状态机。外部输入会使其从“未激活”状态转换为“激活”状态。 - evnu