文档章节

Erlang的supervisor

通九互联科技
 通九互联科技
发布于 2016/04/21 18:22
字数 533
阅读 202
收藏 4

万事皆有因

这件事情的开始是非常加单的,我想把几个模块独立化,变的可以重复使用。然后就创建了几个application,但是将几个模块整合到同一个项目的时候,犯了一个小小的错误,这个错误虽然不是很致命,但是是一个非常不好的。


产生原因

一开始,我有一个主干项目A,创建了SupervisorA。之后我创建了一个项目B,同时创建了一个SupervisorB。然后将两个项目整合的时候,我项目B中的模块X的start_link的代码如下面这样

-module(mod_x).
-export([start_link/1]).
start_link(opts)->
 Child = {mod_y,{mod_y,start_link,[]},permanent,5000,worker,[mod_y],
 supervisor:start_child(supervisor_b,Child).

然后我在主干项目中的SupervisorA的代码写成了这个样子

-module(supervisor_a).
-export([start_link/0]).
-export([init/1]).
start_link() ->
  supervisor:start_link({local, ?MODULE}, ?MODULE, []).
init([])->
  RestartStrategy = {one_for_one, 5, 10},
  MFA = {mod_x,start_link,[]},
  Child = {mod_x,MFA,permanent,5000,worker,[mod_x]},
  {ok, { RestartStrategy,[Child]} }.

此时此刻我想大家已经看出问题了。


解释下

这样执行下来,当打开observer会观察到mod_y的进程是和SupervisorB关联,而不是和SupervisorA关联。我先说下为什么是和SupervisorB关联而不是和SupervisorA关联。然后再说下会有什么问题。

为什么和SupervisorB关联。

因为supervisor的start_child方法,是通过gen_server:call的方式,让指定的Supervisor通过start_link来创建child。而supervisor的start_link也是让指定的Supervisor通过mod:start_link来创建。换句话,就是supervisor并不是使用monitor机制,而是使用trap_exit机制来监控它所创建的进程。

那么会出现什么问题。

如果mod_y这个进程,不小心死掉了,那么当我们通过supervisor:which_children(SupervisorA)去寻找child的pid的时候,我们是无法拿到正确的Pid。原因就是上面那个,mod_y死掉后是SupervisorB负责重启的,而SupervisorA根本不知道这个变化。

© 著作权归作者所有

上一篇: Riak实战-规划
下一篇: Scala的Self-Type
通九互联科技
粉丝 133
博文 37
码字总数 21775
作品 1
大连
个人站长
私信 提问
[Erlang 0015]Erlang OTP设计原则

阅读Erlang官方文档经常可以读到下面两句: "xxx implemented using this module will have a standard set of interface functions and include functionality for tracing and error report......

唐玄奘
2017/12/03
0
0
为什么要用elixir编写并发应用

随着cpu数量的增多,程序越来越强调并发。 而提到并发,就经常会提到函数式编程。 函数式与面向对象的主要区别 函数式更强调精确性。 函数式用变形替代了修改。 Elixir中的进程 Elixir中的p...

ljzn
2016/09/18
123
0
[Erlang 0025]理解Erlang/OTP - Application

1>application:start(log4erl). 我们就从这一行命令开始说起吧,回车之后可以把log4erl应用程序启动起来.Erlang/OTP中的能完成特定功能集合的组件被称为application. ,application是Erlang代码...

唐玄奘
2017/12/04
0
0
Erlang中我使用了supervisor,但是我想在重启时,恢复工作进程的数据,但是不使用io

Erlang中我使用了supervisor,但是我想在重启时,恢复工作进程的数据,但是不使用io操作,有什么办法可以直接将数据放在内存中,而且下次还能正确读取

2014/10/09
817
3
[Erlang 0023] 理解Erlang/OTP gen_server

Erlang的OTP behaviour是对一些通用编程模式的抽象,在用Erlang 语言做开发时可以在behavior基础上快速构建出可用且可靠的功能.OTP behaviour包含genserver genevent genfsm supervisor.其中绝...

唐玄奘
2017/12/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
11
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部