Erlang主管。重新启动进程,如果多次失败,请放弃并发送消息

Erlang主管。重新启动进程,如果多次失败,请放弃并发送消息,erlang,otp,erlang-supervisor,gen-server,Erlang,Otp,Erlang Supervisor,Gen Server,我有几个gen_server工作人员定期向硬件传感器请求一些信息。传感器可能暂时失效,这是正常的。如果传感器出现故障,工作进程将以异常终止 所有工作人员都是通过简单的一对一策略从主管中产生的。此外,我还有一个控制gen_服务器,它可以启动和停止工人,还可以接收'DOWN'消息 现在我有两个问题: 如果工作人员由主管重新启动,其状态将丢失,这是我无法接受的。我需要重新创建具有相同状态的工作进程 如果工人在一段时间内多次出现故障,则传感器发生严重故障,需要操作员予以注意。因此,我需要放弃重新启动wo

我有几个
gen_server
工作人员定期向硬件传感器请求一些信息。传感器可能暂时失效,这是正常的。如果传感器出现故障,工作进程将以异常终止

所有工作人员都是通过
简单的一对一
策略从主管中产生的。此外,我还有一个控制
gen_服务器
,它可以启动和停止工人,还可以接收
'DOWN'
消息

现在我有两个问题:

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

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

  • 我看到两种解决办法:

  • 将管理器中的进程类型设置为临时,并在control
    gen_server
    中对其进行控制并重新启动。但这正是主管应该做的,所以我正在重新发明轮子

  • 为主主管下的每个工人创建一个主管。这正好解决了我的第二个问题,但是在重新启动后工作进程的状态丢失了,因此我需要一些存储,比如ets表来存储工作进程的状态

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

    如果工作进程由主管重新启动,则其状态将丢失,而不是 我能理解。我需要重新创建具有相同状态的worker

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

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


    对。一般来说,你对上司的逻辑越少越好。主管应该只监督子流程,就这样。但你仍然可以告诉你的上司,无论何时你的上司放弃了(只是一个想法)。这样,您可以避免重新发明轮子,并使用主管来管理孩子。

    此线程将回答您的大多数问题。基本上,主管不会存储行为状态,相反,您必须自己处理。谢谢你的回答。大致上,我实现了类似的功能。现在我有两层监管者,因此每个工作人员都有其专用的监管者,如果工作人员不能频繁工作,其监管者就会死亡,并向控制服务器发送“停机”消息。所有工作人员将关键信息保存在ETS表中。真的非常感谢你!