【发布时间】:2012-11-04 07:02:43
【问题描述】:
我有一个由 gen_servers 作为临时子级组成的监督树,它们的生命周期很短。当需要清理和终止时,每个孩子都会收到一条消息。
受我从tinymq 项目中阅读的代码的启发,有一个控制器进程可以保存这些孩子的 Pid 的字典。
在他们的情况下,他们使用 max_age 设置和一些 code 来过期他们的频道,我不太明白。
在我的情况下,我尝试使用supervisor:terminate_child(Sup, Pid),在做了一些清理之后,如下:
孩子本身,在控制器上执行 RPC:
fs_outbound_controller:deallocate_me(UUID, self());
控制器:
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}}.
我观察到的问题是 ERROR 记录器报告了关于 gen_server 终止返回值的崩溃?
** Reason for termination ==
** {bad_return_value,ok}
感谢您的帮助。
编辑
我做了其他事情,我将对 deallocate_me 的调用从 RPC 转移到从子进程到控制器的消息。认为也许孩子对控制器进行 RPC 调用,而这反过来又终止了孩子,这导致了一些返回问题。处理程序保持不变
handle_info({deallocate_me, UUID, Pid}, #state{dict = Uuid2Pid} = State) -> NewDict = dict:erase(UUID, Uuid2Pid), 主管:terminate_child(fs_outbound_extn_sup,Pid), error_logger:info_msg("成功释放 ~p", [UUID]), {noreply, State#state{dict=NewDict}}。
但现在我仍然得到:
** Reason for termination ==
** {bad_return_value,{deallocate_me,"49d9f7cb-62d3-4c3f-abf1-a19848967a9a",
<0.50.0>}}
【问题讨论】:
标签: erlang erlang-otp