退出的主管

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了退出的主管相关的知识,希望对你有一定的参考价值。

我有一个具有两个工作进程的主管:一个处理与远程服务器连接的TCP客户端和一个处理连接协议的FSM。

处理子进程中的TCP错误会使代码变得非常复杂。所以我更喜欢“让它崩溃”,但这有一个不同的问题:当服务器无法访问时,将很快达到最大重启次数,并且主管将与我的整个应用程序一起崩溃,这对于这个案例。

我想要的是采用后退的重启策略;如果失败了,如果主管知道何时由于崩溃而重新启动(即将其作为参数传递给init函数)就足够了。我找到了this mailing list thread,但是有更官方/更好的测试解决方案吗?

答案

您可能会发现我们的supervisor cushion是一个很好的起点。我使用它减慢了必须运行的东西的重启速度,但在启动时很快失败(例如遇到资源问题的端口)。

另一答案

我多次使用erlang时遇到过这个问题并尝试了很多解决方案。我认为我发现最好的最好的办法就是有一个由主管启动的额外流程,并启动可能崩溃的流程。

它在启动时启动孩子,等待孩子退出并重新启动孩子(延迟)或适当退出。我认为这比后退服务器(你链接到的)更简单,因为你只需要保持关于一个孩子的状态。

我使用的另一个解决方案是必须将子进程作为瞬态启动,并有一个单独的进程,轮询并重新启动任何已崩溃的进程。

另一答案

首先,您希望通过在init中使用process_flag(trap_exit, true)来提前终止孩子。

然后你需要决定你想要延迟重启的时间,例如10秒,在这里做

handle_info({'EXIT', _Pid, Reason}, State) ->
    erlang:send_after(10000, self(), {die, Reason}),  
    {noreply, State};

最后,让这个过程死去

handle_info({die, Reason}, State) ->
    {stop, Reason, State};

以上是关于退出的主管的主要内容,如果未能解决你的问题,请参考以下文章

Erlang - 主管和 gen_fsm 上的异常退出

使用 onBackPressed 仅从第一个片段退出 App

如何防止在 Android 片段/活动中意外退出应用程序?

如何从另一个片段访问片段对象

当我将片段添加到我的视图寻呼机时(在嵌套滚动视图中),我无法从具有设备后退按钮的应用程序退出

C语言必会面试题(3耶稣有13个门徒,当中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:13人围坐一圈,从第一个開始报号:1,2,3,1,2,3...。凡是报到“3”就退出圈子,...)(代码片段