gpt4 book ai didi

erlang - 如何在 Erlang/OTP 中将主管的 child pid 共享给另一个 child

转载 作者:行者123 更新时间:2023-12-04 12:10:33 25 4
gpt4 key购买 nike

在我的 Erlang/OTP 应用程序中,我有一个 one_for_all主管 ( sup ) 有几个 child 。其中一个 child ( child1 gen_server 行为)应该能够向另一个 child 发送消息( child2 supervisor 行为)。当然,我可以注册它,但用多余的名称堵塞全局范围似乎不是一个好主意。

因此,使这种交互成为可能的唯一方法是提供 child 1 pid 为 child 2 .说到做到。有supervisor:wich_children/1调用适当的功能。刚好路过支持 的 pid 作为 的参数chidl1 , 调用which_childrenchild1:init ,并且...陷入僵局。 支持 正在等待 child 1 开始, child 1 正在等待支持 child 说明:

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 设计原则,监督树成员之间最常规的交互方式是什么?

最佳答案

当然,您不能在主管尚未启动所有子项时向主管询问其子项:)

实际上,注册(在本地,使用 erlang:register())并不是一个坏主意。此外,如果在 child1 中处理原始 pid,您应该手动设置对 child2 pid 的监控,以便能够对可能的崩溃等使用react,但是注册后您只需直接按名称询问它。

如果没有注册,你可以推迟通知 child ,直到 supervisor:start_link 被调用:

start_link() ->
R=supervisor:start_link({local, ?SERVER}, ?MODULE, []),

%% Here supervisor is started so you can notify its children
R.

关于erlang - 如何在 Erlang/OTP 中将主管的 child pid 共享给另一个 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13520727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com