一个常见的情况: supervisor 下启动了N个子进程,如何访问这些子进程?
一般可以通过两种方式:
1.通过PID
所有的子进程在创建完成后都会有相应的PID,将这些个PID存到本地的表中,需要时通过PID去访问进程。
2.通过进程名
在注册一个进程的时候为其指定相应的名称,需要时通过进程名访问进程。
下面为一个简单的例子:
建立一个supervisor ,采用simple_one_for_one 的启动策略:
-module(superMan).
-behaviour(supervisor).
-export([start_sup/0,open_wc/1]).
-export([
init/1
]).
-define(SERVER, ?MODULE).
start_sup()->
supervisor:start_link({local,superMan}, ?MODULE, [])
.
init([]) ->
AChild =
{wcroom,
{thewc,start_link,[]},
temporary,
2000,
worker,
[thewc]},
{ok,
{{simple_one_for_one,0,1}, [AChild]}}.
open_wc(Num)->
supervisor:start_child(superMan,[Num])
.
子进程的模块定义如下:
-module(thewc).
-behaviour(gen_server).
-export([lashi/2,start_link/1]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
-record(state, {num}).
start_link(Num)-> gen_server:start_link({local,list_to_atom(integer_to_list(Num))},?MODULE,[Num],[])
.
init([Num]) ->
{ok, #state{num=Num}}.
handle_call({lashi,Name}, From, State) ->
#state{num=Num}=State,
io:format("man ~p is lashing in wc~p",[Name,Num]),
{reply, ok, State};
handle_call(Request, From, State) ->
Reply = ok,
{reply, Reply, State}.
handle_cast(Msg, State) ->
{noreply, State}.
handle_info(Info, State) ->
{noreply, State}.
terminate(Reason, State) ->
ok.
code_change(OldVsn, State, Extra) ->
{ok, State}.
lashi({pid,Ref},Name)->
gen_server:call(Ref, {lashi,Name})
;
lashi(Num,Name)->
gen_server:call(list_to_atom(integer_to_list(Num)), {lashi,Name})
.
测试方法如下:
start()->
{ok,Pid}=superMan:start_sup(),
unlink(Pid),
{ok,Pid1}=superMan:open_wc(1),
thewc:lashi({pid,Pid1}, "wang"),
{ok,Pid2}=superMan:open_wc(2),
thewc:lashi(2, "zhang")
.
测试结果如下:
man "wang" is lashing in wc1
man "zhang" is lashing in wc2ok
需要注意的是:在gen_server:call(Module,Args) 的时候,如果要调用的进程是注册在本地的,则Module 直接为进程名对应的Atom 值。只有这个进程注册为gloable 时才需要指定Module 为{gloable,Module},否则会报nodedown异常。
分享到:
相关推荐
关于erlang并发开发的一些例子,便于学习supersivor
1.完成makefile,直接运行/script目录中的makefile.cmd就能编译文件 2.完成启动多节点的脚本,运行/script目录中的run.cmd可以启动3个节点,...3.完成跨节点函数的调用,记录日志都会在gm节点中执行 4.完成日志记录系统
Erlang进程模型特点 一个进程可以创建数以万计的轻量级进程 每个轻量级进程仅仅完成单一功能 一个复杂的功能可以由多个轻量级进程协同完成 当遇到file或socket等阻塞的io时, 调用的轻量级进程被阻塞,整个进程不...
进程间上下文切换对于Erlang来说仅仅 只是一两个环节,比起C程序的线程切换要高效得多得多了。 使用Erlang来编写分布式应用要简单的多,因为它的分布式机制是透明的:对于程序来说并不知道自己是在分布式运行。
erlang 中文基础教程erlang 中文基础教程
erlang调用java,在yaws应用里调用J2EE方法
个人学习Erlang对于Erlang处理数据的各种方式的总结,讲述编程语言Erlang的ets,dets,mnesia,mysql,dict,和进程字典的用法,希望能帮助读者在这个总结里学到一些东西.
用两种不同的方法产生服从erlang分布的随机数
erlang中文基础教程
Worker Pool的目标是非常简单: 提供以透明的方式管理一批工作进程并且对分配到池中的任务尽最大努力实现负载均衡。一个 Echo 服务器示例:-module(echo_server). -author('elbrujohalcon@inaka.net'). -...
诊断以及调试生产环境中的Erlang 系统。在程序员学习新的语言和环境时,都需要一个摸索 阶段,也就是学会在社团的帮助下,脱离指南,解决实际问题。 本书假设读者精通基本的Erlang和OTP框架。在本书中,会对一些难以...
主要介绍了Erlang中的注册进程使用实例,本文给出正常进程通信实例和使用使用注册进程通信实例,需要的朋友可以参考下
● 并发性 - Erlang支持超大量级的并发进程,并且不需要操作系统具有并发机制。 ● 分布式 - 一个分布式Erlang系统是多个Erlang节点组成的网络(通常每个处理器被作为一个节点) ● 健壮性 - Erlang具有多种基本的...
Erlang/OTP R11B 文档 Erlang/OTP R11B documentation
erlang入门电子书 erlang编程 Introducing Erlang,作者Simon.St.Laurent
Erlang中文手册
ErlangB和ErlangC计算工具(exe可执行文件+excel两个) ErlangB和ErlangC计算工具(exe可执行文件+excel两个)
Erlang 中的Module级别热部署
《Erlang and OTP in Action》、《Erlang程序设计》。