erlang supervisor simple_one_for_one实例
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() ->
receive
Args ->
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). 执行编译命令 + 测试命令。
erlang supervisor simple_one_for_one实例的更多相关文章
- erlang supervisor说明
Supervisor Behaviour是一个用来实现一个supervisor进程来监控其他子进程的模块 子进程可以是另一个supervisor,也可以是一个worker进程. worker进程一般使 ...
- [erlang]supervisor(监控树)的重启策略
1. init函数 init() -> {ok, {SupFlags, [ChildSpec,...]}} | ignore. [ChildSpec,...] 是在init之后默认要启动的子进程 ...
- erlang supervisor中启动普通的进程
文字部分转自: http://1234n.com/?post/qou3eb supervisor的子进程 一开始使用supervisor的时候,我用的是init/1返回子进程规格列表的方式,并且所有子 ...
- 理解Erlang/OTP Supervisor
http://www.cnblogs.com/me-sa/archive/2012/01/10/erlang0030.html Supervisors are used to build an hie ...
- Supervisor行为分析和实践
1.简介 Erlang要编写高容错性.稳定性的系统,supervisor就是用来解决这一问题的核心思想.通过建立一颗监控树,来组织进程之间的关系,通过确定重启策略.子进程说明书等参数信息来确定 ...
- erlang四种监控策略
转自:http://jasionq.blog.163.com/blog/static/10970577920133883158424/ Supervisor Behaviour是一个用来实现一个sup ...
- 分布式mongodb分片集群
本博客先简单介绍mongodb入门以及单实例以及mongodb的主从(主从官网是不提倡用的,原因后续介绍),副本集,分片. 第一:nosql介绍: 数据库分为关系型数据库与非关系型数据库,及具代表性的 ...
- Syncthing源码解析 - 启动过程
我相信很多朋友会认为启动就是双击一下Syncthing程序图标,随后就启动完毕了!如果这样认为,对,也不对!对,是因为的确是这样操作,启动了Syncthing:不对是因为在调试Syncthing启动过 ...
- 最近学习工作流 推荐一个activiti 的教程文档
全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...
随机推荐
- linux下搭建SVN服务器完全手册
原文:http://www.cnblogs.com/wrmfw/archive/2011/09/08/2170465.html 系统环境 RHEL5.4最小化安装(关iptables,关 ...
- mac下如何全量删除短信内容
退出messages应用 执行命令:rm -r ~/Library/Messages/chat.* 重启messages 如果遇到下面问题:重启mac
- WSDL-学习总结
1.什么是WSDL 是一种使用 XML 编写的文档.这种文档可描述某个 Web service.它可规定服务的位置,以及此服务提供的操作(或方法). 2.WSDL文档结构: <binding&g ...
- 利用PMKID破解PSK的实际测试与影响评估
在2018年8月4日,一位研究员在hashcat论坛中发布了一篇帖子,表示他研究WPA3协议密码破解方法的过程中,发现了一个针对WPA/WPA2协议密码破解的新方法,使用PMKID(the Pairw ...
- 【转】php中的会话机制(2)
原文:https://segmentfault.com/a/1190000000468220 发现,在调用session_start()的时候, session_start() 里面应该是有调用类似 ...
- java 获取进程的processId
package us.mine.demo.jvm.util; import java.lang.management.ManagementFactory; import java.lang.manag ...
- Linux下libsvm的安装及简单练习
引文:常常在看paper的时候.就看到svm算法,可是要自己来写真的是难于上青天呀! 所幸有一个libsvm的集成软件包给我们使用,这真的是太好了.以下简介下怎么来使用它吧! LIBSVM是一个集成软 ...
- Boost.Asio c++ 网络编程翻译(21)
同步VS异步 Boost.Asio的作者做了一个非常惊艳的工作:它能够让你在同步和异步中自由选择,从而更好的适应你的应用. 在之前的章节中,我们学习了每种类型应用的框架,比方同步client,同步服务 ...
- socket何时处于”读就绪状态“?---通过“应用程序大爷"和"内核孙子"对话再看重要的select函数的使用方法
前面. 我已经陆续介绍过select函数的一些零碎知识, 在本文中,我们来讨论这样一个问题:socket何时处于读就绪状态? 事实上主要讨论select函数, 毕竟socket的读就绪状态会导致sel ...
- java实现折半排序算法
折半插入排序法,又称二分插入排序法,是直接插入排序法的改良版,也需要执行i-1趟插入,不同之处在于,第i趟插入,先找出第i+1个元素应该插入的的位置,假定前i个数据是已经处于有序状态. 折半插入排序( ...