http://www.cnblogs.com/little-ant/p/3196201.html

simple_one_for_one vs one_for_one:

相同点:

这种Restart Strategy和one_for_one基本相同(即当一个child process挂掉后,仅仅重启该child process 而不影响其他child process)。

异同点:

1, simple_one_for_one supvisor启动时不会启动任何子进程,所有子进程都只能通过调用 supervisor:start_child(Sup, Args) 来动态启动。

2, simple_one_for_one supvisor持有child process的定义,并有一个dict存放数据, 其实就是如干个child process,共享一份数据。

3, 一个simple_one_for_one supervisor只有一个(single)simple_one_for_one的定义, 也就是说它只能生产出一种类型worker process。

supervisor:start_child(Sup, Args) :

Sup:  Supervisor的Pid或者registered Name.

Args: 当supervisor的类型是simple_one_for_one时,Args会追加到spec的参数中。

例如:

-module(simple_sup).
-behaviour(supervisor).-export([start_link/0]).
-export([init/1]).start_link() ->supervisor:start_link({local,?MODULE}, ?MODULE, []).init(_Args) ->{M, F, A} = _Args,{ok, {{simple_one_for_one, 0, 1},[{M, {M, F, A},temporary, brutal_kill, worker, [M]}]}}.

调用supervisor:start_child(simple_sup, Args)后,最终启动子进程的代码会是:apply(M, F, A++Args).

调用supervisor:start_child(Sup, Args)可能会遇到的错误:

1, noproc: 可能的原因是在调用supervisor:start_link时没写参数{local, ?MODULE},即上面代码红色部分,此时进程Sup并不存在,所以会产生

noproc错误。

2,undef: 可能的原因是A++Args后,与child process的start_link函数参数不一致。

实例代码:

实例包含两部分,一是监控普通进程(normal_process.erl),二是监控gen_server进程(gen_server_process.erl)。

common.hrl

%%-define(CALL, normal_process).
-define(CALL, gen_server_process).

simple_sup.erl

-module(simple_sup).
-behaviour(supervisor).-export([start_link/0]).
-export([init/1]).-include("common.hrl").start_link() ->supervisor:start_link({local, ?MODULE}, simple_sup, []).init(_Args) ->{ok, {{simple_one_for_one, 0, 1}, [{?CALL, {?CALL, start_link, []},temporary, brutal_kill, worker, [?CALL]}]}}.

normal_process.erl

-module(normal_process).-export([start_link/0, start_loop/1]).start_link() ->proc_lib:start_link(?MODULE, start_loop, [self()]).start_loop(Parent) ->proc_lib:init_ack(Parent, {ok, self()}),loop().loop() ->receiveArgs ->io:format("~p~n", [Args])end.

gen_server_process.erl

-module(gen_server_process).
-behaviour(gen_server).
-export([start_link/0]).%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,terminate/2, code_change/3]).%% interface
-export([start/0, stop/0, echo/1]).%% interface implement
start()      -> start_link().
stop()       -> gen_server:call(?MODULE, stop).
echo(String) -> gen_server:call(?MODULE, {echo, String}).%% gen_server callbacks implement
start_link() -> gen_server:start_link({local,?MODULE}, ?MODULE, [], []).init([]) ->{ok, 0}. handle_call({echo, String}, _From, Tab) ->  Reply = String,{reply, Reply, Tab};handle_call(stop, _From, Tab) ->{stop, normal, stopped, Tab}.handle_cast(_Msg, State) -> {noreply, State}.
handle_info(_Info, State) -> {noreply, State}.
terminate(_Reason, _State) -> ok.
code_change(_OldVsn, State, _Extra) -> {ok, State}.

编译命令:

c(simple_sup).
c(normal_process).
c(gen_server_process).

测试命令:

simple_sup:start_link().
supervisor:start_child(simple_sup, []).

测试通过start_child启动普通进程:

修改common.hrl:-define(CALL, normal_process). 执行编译命令 + 测试命令。

测试通过start_child启动gen_server进程:

修改common.hrl:-define(CALL, gen_server_process). 执行编译命令 + 测试命令。

转载于:https://www.cnblogs.com/fvsfvs123/p/4243734.html

erlang supervisor simple_one_for_one实例相关推荐

  1. erlang监控树 supervisor

    erlang监控树 supervisor Supervisor Behaviour是一个用来实现一个supervisor进程来监控其他子进程的模块 子进程可以是另一个supervisor,也可以是一个 ...

  2. Supervisor行为分析和实践

    转载的这里 http://www.cnblogs.com/liuweiccy/p/4622075.html 1.简介 Erlang要编写高容错性.稳定性的系统,supervisor就是用来解决这一问题 ...

  3. [Erlang 0014]Erlang垃圾回收机制

    前面的Erlang杂记中我们简单提到过Erlang的垃圾回收机制:1.以进程为单位进行垃圾回收 2.ETS和原子不参与垃圾回收.今天我们继续这一话题,关注更多关于细节. 在Erlang的官方文档中,关 ...

  4. erlang与java构建的节点通讯

    我们知道,erlang在开源社区的活跃度远远不及java社区,在java社区中有很多优秀的开源框架,比如mybatis.hibernate. springboot.hadoop.hbase等,为了让e ...

  5. Linux安装supervisor:一个进程控制系统

    文章目录 0.使用Supervisor 0.1安装 0.2配置supervisord.conf 0.3启动supervisord 0.4启动Elasticsearch 0.5启动Kibana 0.6启 ...

  6. 云信私有化方案中如何搭建高可用的日志和监控平台?

    导读 云信公有云系列产品已经稳定运行数年,随着企业对信息安全和数据隔离愈加重视,云信产品私有化课题必然成为云信发展过程中一个的重要分支.依赖虚拟化和容器技术的日臻成熟,云信业务系统已经全面完成私有化, ...

  7. 【Rust日报】 2019-04-05

    「系列文章」审阅Sled源码 Part I #CodeReview #sled Sled项目是一个用Rust编写的嵌入式数据库.该文作者在日程工作中用到了它,为了掌握它的工作原理,准备开始写这个系列的 ...

  8. 前端开发基础知识汇总

    一.HTML 1.前言与常用标签 浏览器 内核 备注 IE Trident IE.猎豹安全.360极速浏览器.百度浏览器 firefox Gecko 可惜这几年已经没落了,打开速度慢.升级频繁.猪一样 ...

  9. Spring Cloud微服务系统架构的一些简单介绍和使用

    Spring Cloud 目录 特征 云原生应用程序 Spring Cloud上下文:应用程序上下文服务 引导应用程序上下文 应用程序上下文层次结构 改变Bootstrap的位置Properties ...

最新文章

  1. 技术除了工作,还有什么可以提升的?
  2. go语言学习(4)接口,duck typing
  3. python怎么知道用哪个库使用-Python绘图库讲解:4大常用库你准备学哪个?
  4. 【剑指offer】【leetcode精选题集】【Java】剑指offer题解合集 更新中
  5. HTML+CSS+JS实现 ❤️贪吃蛇游戏、你能吃过我?❤️【源码送给你一起来玩-建议收藏】
  6. Javascript鼠标键盘事件
  7. 疯狂python讲义pdf_重磅!Python再次第一,Java和C下降,凭什么?
  8. js中的object
  9. python读配置文件转字典_python中读取配置文件的方式
  10. 驱动兼容_「图」英特尔DCH驱动新版发布:重点修复Windows 10兼容性问题
  11. 大众点评_token及登录分析
  12. 工程系列 计算机中级职称,工程类中级职称有哪些
  13. 架设网页手游需要什么服务器,架设手游用什么云服务器
  14. 如何复制权限受限PDF文件的内容(亲测有效,Microsoft Edge打开pdf文件)
  15. 流体力学——流体动力学
  16. Araxis Merge对比软件工具
  17. 受贸易战影响,H1B签证开始大量RFE了?
  18. 中国增长最快的机器人市场——IFR《世界机器人报告 2020》(World Robotics 2020 Report)
  19. JS的 try catch使用心得
  20. 来自灵魂深处的拷问:人为什么要活着?

热门文章

  1. sonar jacoco 覆盖率为0_Jacoco统计代码覆盖率
  2. python2.7升3.7_升级python2.7至python3.7
  3. oracle打散分组函数,oracle分组函数
  4. vmd变分模态分解程序matlab论坛_博士兼职辅导员论坛分享会第三期
  5. python中label组件参数_Python tkinter(六) 标签(Label)组件的属性说明及示例
  6. react 组件连动效果_react-redux应用之独立组件联动实例
  7. 职中计算机网络服务器管理必考题,2017年河北科技师范学院职教研究所、教育学院996计算机知识综合之计算机网络考研导师圈点必考题汇编...
  8. 计算机 大学活动 游戏,朝花夕拾”——中国矿业大学计算机学院积极举办“那些年我们一起玩过的游戏”活动...
  9. 随笔:送给初次使用PCL库的小伙伴
  10. 1行Python代码制作动态二维码