监督与监督?

时间:2012-10-27 23:46:42

标签: erlang

主管是否与监视器相同?使用显示器是好还是使用主管更好?

我不确定何时使用显示器而不是主管。

2 个答案:

答案 0 :(得分:7)

建议阅读:http://learnyousomeerlang.com/errors-and-processes#monitors

主管是一种非常特殊的关系。为了拟人化,作为一名主管,我直接负责下属的福祉。如果他/她失败了,我需要做点什么来解决这个问题。

链接由主管和其他直接相关的进程使用,这些进程都属于同一系统。

对于我公认的未经训练的人来说,监视器类似于链接,但主要用于对流程是否正在运行但与流程没有直接关系感兴趣的外部流程。

以DNS为例,在我浪费时间尝试从中获取响应之前知道DNS服务器是否正在运行会很有帮助,但如果DNS服务器出现故障,那么启动它就不是我的工作了。起来。我只需要切换到不同的DNS服务器。

答案 1 :(得分:1)

主管是OTP行为。您将在流程层次结构中使用它,在层次结构之上是主管,其职责是应用您为每个子项定义的重新启动策略。

孩子将是另一位主管或工人。

工人是完成工作的模块。在OTP架构中,它们通常是gen_server,gen_event,gen_fsm ......它们可能正常终止(在这种情况下没有做任何事情)或崩溃。然后,主管将应用重启策略:

  • one_for_one :重启流程
  • one_for_all :终止所有孩子并重启所有孩子
  • rest_for_one :在开始列表中终止以下子项并按正确顺序重新启动它们

为实现此目的,主管使用由链接或spawn_link函数创建的双向连接。这两个过程是相互关联的;这意味着如果其中任何一个崩溃,另一个也会崩溃,除非它设置process_flag(trap_exit, true),在这种情况下它将收到消息{'EXIT',FromPid,Reason}

这是一个包含3个主管的层次结构示例(在我的情况下,Task_Sup使用simple_one_for_one策略,子进程使用Mngr_Server中的Create(Task)创建,同一个Mngr_server监视每个子进程):

enter image description here

监视器是通过调用

创建的2个进程之间的单向连接 进程Pid1中的

Ref = erlang:monitor(process, Pid2)。然后,如果Pid2终止,Pid1将收到一条消息

{'DOWN', Ref, process, Pid2, Reason}

Pid1必须检查收到的消息才能获知Pid2终止。

相关问题