2

主管和班长一样吗?使用监视器好还是使用主管更好?

我不确定何时使用监视器而不是主管。

4

2 回答 2

7

推荐阅读: http: //learnyousomeerlang.com/errors-and-processes#monitors

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

链接供主管和其他直接相关的流程使用,它们都是同一系统的一部分。

监视器,在我公认的未受过教育的眼中,类似于链接,但主要用于对进程是否正在运行感兴趣但不直接相关的外部进程。

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

于 2012-10-27T23:56:45.787 回答
1

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

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

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

  • one_for_one : 重启进程
  • one_for_all:终止所有子节点并重新启动它们
  • rest_for_one:终止启动列表中的以下子项并以正确的顺序重新启动它们

为此,监督者使用由 link 或 spawn_link 函数创建的双向连接。这两个过程是联系在一起的;这意味着如果其中任何一个崩溃,另一个也会崩溃,除非它设置process_flag(trap_exit, true)并且在这种情况下它将收到消息{'EXIT',FromPid,Reason}

这是具有 3 个主管的这种层次结构的示例(在我的情况下,Task_Sup 使用 simple_one_for_one 策略,并且使用来自 Mngr_Server 的 Create(Task) 创建子级,相同的 Mngr_server 监视每个子级):

在此处输入图像描述

监视器是通过调用创建的 2 个进程之间的单向连接

Ref = erlang:monitor(process, Pid2)在进程 Pid1 中。那么如果 Pid2 终止,Pid1 将收到一条消息

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

Pid1 必须检查传入消息以获取 Pid2 终止的通知。

于 2012-10-29T12:38:41.497 回答