Erlang主管。重启过程,若多次失败,放弃并发送消息

时间:2012-03-24 17:47:48

标签: erlang otp supervisor gen-server

我有几个gen_server工作人员定期从硬件传感器请求一些信息。传感器可能暂时失效,这是正常的。如果传感器失败,则工作程序将终止并发生异

所有工人都是以simple_one_to_one策略形成的主管。我还有一个控件gen_server,可以启动和停止工作人员,还可以收到'DOWN'条消息。

所以现在我有两个问题:

  1. 如果主管重新启动工作人员,其状态将丢失,这是我无法接受的。我需要重建具有相同状态的工人。

  2. 如果工人在一段时间内发生故障,传感器会发生严重事故,需要操作员注意。因此,我需要放弃重新启动worker并向事件处理程序发送消息。但是,排气过程重启限制后,主管的默认行为终止。

  3. 我看到两个解决方案:

    1. 将主管中的进程类型设置为临时,并控制它们并在控制gen_server中重新启动它们。但这正是主管应该做的,所以我正在重新发明轮子。

    2. 为主管下的每个工人创建一名主管。这正好解决了我的第二个问题,但重启后工人的状态就丢失了,因此我需要一些存储器,比如存储工人状态的ets表。

    3. 我是Erlang的新手,所以我需要一些建议来解决我的问题,哪个(如果有的话)解决方案是最好的。提前谢谢。

1 个答案:

答案 0 :(得分:2)

  

如果主管重新启动工作人员,则其状态将丢失,但事实并非如此   可以加入我。我需要重建具有相同状态的工人。

如果您需要进程状态来持久化进程生命周期,则需要将其存储在其他位置,例如在ETS表中。

  

如果工人在特定时间内多次失败   传感器发生了严重的事情,需要操作员   注意。因此,我需要放弃重新启动的工作人员并发送一些   事件处理程序的消息。但主管的默认行为是   在排气过程重启限制后终止。

正确。一般来说,你输入主管的逻辑越少,就越好。监督员应该只监督子流程,就是这样。但是你仍然可以monitor你的主管,并在你的主管放弃时得到通知(只是一个想法)。通过这种方式,您可以避免重新发明轮子并使用主管来管理孩子。