3

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

所有工人都是从具有simple_one_to_one策略的主管中产生的。我还有一个控件gen_server,它可以启动和停止工作人员,还可以接收'DOWN'消息。

所以现在我有两个问题:

  1. 如果工作人员由主管重新启动,则其状态将丢失,这对我来说是不可接受的。我需要重新创建具有相同状态的工人。

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

我看到两个解决方案:

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

  2. 为主要主管下的每个工人创建一个主管。这正好解决了我的第二个问题,但是重启后worker的状态会丢失,因此我需要一些像ets table这样的存储来存储worker的状态。

我对 Erlang 很陌生,所以我需要一些关于我的问题的建议,关于哪种(如果有的话)解决方案是最好的。提前致谢。

4

1 回答 1

2

如果工作人员由主管重新启动,则其状态将丢失,这对我来说是不可接受的。我需要重新创建具有相同状态的工人。

如果您需要流程状态来保持流程生命周期,则需要将其存储在其他地方,例如 ETS 表中。

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

正确的。一般来说,你在主管身上投入的逻辑越少越好。监督者应该只监督子进程,仅此而已。但是您仍然可以监控您的主管,并在您的主管放弃时收到通知(只是一个想法)。这样您就可以避免重新发明轮子并使用主管来管理孩子。

于 2012-03-28T07:57:35.947 回答