我有几个gen_server
工作人员定期从硬件传感器请求一些信息。传感器可能暂时失效,这是正常的。如果传感器失败,则工作程序将终止并发生异
所有工人都是以simple_one_to_one
策略形成的主管。我还有一个控件gen_server
,可以启动和停止工作人员,还可以收到'DOWN'
条消息。
所以现在我有两个问题:
如果主管重新启动工作人员,其状态将丢失,这是我无法接受的。我需要重建具有相同状态的工人。
如果工人在一段时间内发生故障,传感器会发生严重事故,需要操作员注意。因此,我需要放弃重新启动worker并向事件处理程序发送消息。但是,排气过程重启限制后,主管的默认行为终止。
我看到两个解决方案:
将主管中的进程类型设置为临时,并控制它们并在控制gen_server
中重新启动它们。但这正是主管应该做的,所以我正在重新发明轮子。
为主管下的每个工人创建一名主管。这正好解决了我的第二个问题,但重启后工人的状态就丢失了,因此我需要一些存储器,比如存储工人状态的ets表。
我是Erlang的新手,所以我需要一些建议来解决我的问题,哪个(如果有的话)解决方案是最好的。提前谢谢。
答案 0 :(得分:2)
如果主管重新启动工作人员,则其状态将丢失,但事实并非如此 可以加入我。我需要重建具有相同状态的工人。
如果您需要进程状态来持久化进程生命周期,则需要将其存储在其他位置,例如在ETS表中。
如果工人在特定时间内多次失败 传感器发生了严重的事情,需要操作员 注意。因此,我需要放弃重新启动的工作人员并发送一些 事件处理程序的消息。但主管的默认行为是 在排气过程重启限制后终止。
正确。一般来说,你输入主管的逻辑越少,就越好。监督员应该只监督子流程,就是这样。但是你仍然可以monitor你的主管,并在你的主管放弃时得到通知(只是一个想法)。通过这种方式,您可以避免重新发明轮子并使用主管来管理孩子。