主管和班长一样吗?使用监视器好还是使用主管更好?
我不确定何时使用监视器而不是主管。
推荐阅读: http: //learnyousomeerlang.com/errors-and-processes#monitors
主管是一种非常特殊的关系。拟人化,作为主管,我直接对下属的福祉负责。如果他/她失败了,我需要做一些事情来解决这个问题。
链接供主管和其他直接相关的流程使用,它们都是同一系统的一部分。
监视器,在我公认的未受过教育的眼中,类似于链接,但主要用于对进程是否正在运行感兴趣但不直接相关的外部进程。
以 DNS 为例,在我浪费时间尝试从它获取响应之前了解 DNS 服务器是否正在运行会很有帮助,但如果 DNS 服务器出现故障,我的工作不是重新启动它。我只需要切换到不同的 DNS 服务器。
主管是一种OTP 行为。您将在进程的层次结构中使用它,在层次结构之上是主管,其职责是应用您为每个孩子定义的重启策略。
孩子将成为另一位主管或工人。
工人是完成这项工作的模块。在 OTP 架构中,它们通常是 gen_server、gen_event、gen_fsm... 它们可能会正常终止(在这种情况下什么都不做)或崩溃。然后主管将应用重启策略:
为此,监督者使用由 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 终止的通知。