退出的主管
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};
以上是关于退出的主管的主要内容,如果未能解决你的问题,请参考以下文章
使用 onBackPressed 仅从第一个片段退出 App
当我将片段添加到我的视图寻呼机时(在嵌套滚动视图中),我无法从具有设备后退按钮的应用程序退出
C语言必会面试题(3耶稣有13个门徒,当中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:13人围坐一圈,从第一个開始报号:1,2,3,1,2,3...。凡是报到“3”就退出圈子,...)(代码片段