首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >单独终止simple_one_for_one子节点

单独终止simple_one_for_one子节点
EN

Stack Overflow用户
提问于 2012-11-15 16:12:44
回答 1查看 262关注 0票数 2

我有一棵监督树,由gen_servers组成,作为临时的孩子,它们的寿命很短。当清理和终止的时候,每个孩子都会收到一条消息。

有一个控制器过程,从这些子程序中保存Pid的小块,这是受我从丁尼项目中读到的代码的启发。

在他们的情况下,他们使用max_age设置来终止他们的通道,其中有些代码我不太明白。

在我的例子中,在做了一些清理之后,我尝试使用supervisor:terminate_child(Sup, Pid),如下所示:

子程序本身在控制器上执行RPC:

代码语言:javascript
运行
复制
fs_outbound_controller:deallocate_me(UUID, self());

主计长:

代码语言:javascript
运行
复制
deallocate_me(UUID, Pid) ->
    gen_server:cast(?SERVER, {deallocate_me, UUID, Pid}).

handle_cast({deallocate_me, UUID, Pid}, #state{dict = Uuid2Pid} = State) ->
    NewDict = dict:erase(UUID, Uuid2Pid),
    supervisor:terminate_child(fs_outbound_extn_sup, Pid),
    error_logger:info_msg("Successfully deallocated ~p", [UUID]),
    {noreply, State#state{dict=NewDict}}.

我观察到的问题是,错误记录器报告有关gen_server终止返回值的崩溃?

代码语言:javascript
运行
复制
** Reason for termination == 
** {bad_return_value,ok}

谢谢你的帮助。

编辑

我做了其他事情,将对deallocate_me的调用从RPC转移到子控制器的消息。考虑到可能对控制器执行RPC调用的子节点终止了该子进程,从而导致了一些返回问题。处理程序保持不变。

supervisor:terminate_child(fs_outbound_extn_sup,handle_info({deallocate_me,UUID,Pid},#state{dict = Uuid2Pid} = State) -> NewDict =dict:擦除(UUID,Uuid2Pid),State#state Pid),error_logger:info_msg(“成功地释放~p",UUID),{noreply,State#state{dict=NewDict}。

但现在我还是明白:

代码语言:javascript
运行
复制
** Reason for termination == 
** {bad_return_value,{deallocate_me,"49d9f7cb-62d3-4c3f-abf1-a19848967a9a",
                                    <0.50.0>}}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-15 18:40:22

在我看来

代码语言:javascript
运行
复制
fs_outbound_controller:deallocate_me(UUID, self());

被调用为handle_call/3handle_cast/2handle_info/2中的最后一条语句。正如您可能知道的那样,这些人期待的是类似于{reply, ...}{noreply, ...}{stop, ...}的东西。

记住,gen_server:cast/2总是返回ok,而ServerPid ! Message总是返回Message本身。这就是为什么你第一次被告知{bad_return_value, ok},第二次被告知{bad_return_value, MessageSent}

在您的情况下,我将坚持使用gen_server:cast方法,只需在错误调用之后将正确的返回值放在正确的位置:

代码语言:javascript
运行
复制
fs_outbound_controller:deallocate_me(UUID, self()),
{noreply, State}; %% strongly depends on what your logic there is
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13401599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档