`
yjl49
  • 浏览: 112924 次
社区版块
存档分类
最新评论

Erlang 中进程的两种调用方式

阅读更多

          一个常见的情况: 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异常。

 

 

 

0
0
分享到:
评论

相关推荐

    erlang的timer和实现机制

    Erlang是一种面向并发的、动态类型的编程语言,尤其在分布式系统和实时系统中表现出色。在Erlang中,`timer`模块是用于处理定时任务的关键组件,它提供了多种功能,使得开发者能够轻松地创建延时操作或者周期性任务...

    rustler编写erlang nif

    - Rustler提供了一种在Erlang中优雅处理Rust异常的方式,通过返回错误术语而不是崩溃整个VM。 5. **示例代码**: - 文章通常会包含一个简单的Rust NIF实现,例如计算两个整数的和,展示如何在Rust和Erlang之间...

    erlang 中文,chm参考文档

    3. **行为模式**:如GenServer、GenEvent和Supervisor,它们提供了一种组织和管理Erlang进程的标准方式。 4. **性能优化**:探讨Erlang程序的性能调优技巧,如避免全局变量、合理利用并行性等。 5. **并发与容错**:...

    Concurrent Programming in ERLANG (P1-90)

    在Erlang中,可以通过调用`spawn`函数来创建一个新的轻量级进程。这些进程可以在独立的上下文中运行,并且可以通过消息传递与其他进程进行通信。 **5.2 进程间通信** 进程间通信是Erlang并发模型的核心部分。进程...

    erlang资源

    4. **分布式编程**:Erlang进程可以分布在多个节点上,实现分布式系统的构建。书可能讲解了如何进行节点间通信、分布式数据管理和负载均衡。 5. **模式匹配**:Erlang的函数定义允许模式匹配,使得代码更加简洁和可...

    erlang趣学指南

    多处理,即在多核处理器上同时运行多个Erlang进程,是Erlang提供的又一并发编程模型。 Erlang的OTP框架是一组用于处理常见任务的库和中间件,它包括了用于应用管理和并发控制的工具。 事件处理机制使得Erlang应用...

    Erlang分布式节点中的注册进程使用实例

    通过上述实例代码和解释,我们可以看到如何在Erlang中使用注册进程,如何在分布式节点间发送消息以及如何远程调用函数。掌握这些知识点有助于开发者设计和实现能够应对大规模并发和高可用性的分布式系统。

    C#与Erlang的群通信

    标题中的"C#与Erlang的群通信"指的是在编程领域中,使用C#和Erlang两种不同的编程语言进行集群或分布式系统间的通信。这两种语言各有特点,C#是微软开发的面向对象的编程语言,常用于Windows平台的开发,而Erlang则...

    erlang-java聊天

    Jinterface是Erlang OTP系统的一部分,它提供了一个接口,使得Erlang进程可以与Java虚拟机(JVM)中的对象进行通信。这种通信可能涉及数据交换、调用Java方法或触发Erlang过程。 **聊天程序架构** - **服务器端**:...

    erlang程序设计与入门

    在Erlang中,程序被视为一系列相互独立的函数调用,而不是状态改变的过程。这使得代码更易于理解和测试,因为函数没有副作用,数据不可变。 2. **并发处理** Erlang的并发机制基于轻量级进程(Lightweight ...

    Erlang保留字

    进程字典是Erlang提供的一种全局键值存储机制,用于存储进程内部的状态信息。 - **`@spec put(Key, Value) -> OldValue.`**:用于向进程字典中添加键值对,返回旧的值。 - **`@spec get(Key) -> Value.`**:获取...

    erlang -c语言程序接口.pdf

    Erlang与C语言接口主要通过两种方式实现:一种是将C语言编写的代码直接嵌入到Erlang程序中;另一种是通过进程间通信(IPC)的方式让Erlang与C语言程序进行交互。Erlang倾向于采用第二种方式,即进程间通信,来与C语言...

    erlang_environment_win64_21.0.1.zip

    它的设计哲学鼓励轻量级进程(称为Erlang进程)的大量使用,这些进程之间的通信是通过消息传递实现的。这使得Erlang非常适合构建高可用性和容错性的分布式系统。例如,著名的NoSQL数据库Riak就是基于Erlang构建的。 ...

    ERLang+RabbitMQ安装包

    Erlang和RabbitMQ是两个在分布式系统和消息队列领域中至关重要的技术。Erlang是一种函数式编程语言,以其并发性、容错性和实时性而闻名,尤其适用于构建高可用性的系统。RabbitMQ则是一个开源的消息代理和队列服务器...

    erlang_mysql编译好了

    这里提到的“erlang_mysql编译好了”可能是指已经成功编译了这样的库,它提供了一个Erlang应用程序,使得Erlang进程可以直接与MySQL服务器通信。这个过程通常涉及以下步骤: 1. **获取源代码**:你需要找到Erlang ...

    Erlang语言介绍[E文]下

    为了更好地理解 Erlang 中的进程如何工作,我们来看两个简单的示例: - **斐波那契数列计算**: ```erlang fib(0) -> 1; fib(1) -> 1; fib(N) when N > 0 -> fib(N - 1) + fib(N - 2). ``` 这个例子展示了...

    Erlang_OTP_设计原理(含目录).pdf

    Erlang OTP设计原理是一份深入探讨Erlang/OTP(Open Telecom Platform)框架中设计模式和组织代码原则的文档。Erlang OTP作为Erlang语言的中间件平台,提供了构建可扩展和容错系统的标准方法。 文档开篇就介绍了...

    Erlang与云计算.pdf(确保可以打开)

    Erlang中的进程创建非常简单,可以使用`spawn`函数轻松创建新的进程: ```erlang Pid = spawn(fun() -> loop(0) end). ``` 这里创建了一个新的进程,该进程执行匿名函数`fun() -> loop(0) end`。 **1.4 收发消息** ...

    Concurrent Programming in ERLANG

    - Erlang进程的调度机制是如何工作的。 - 实时性是指系统能够及时响应外部事件的能力,而优先级则决定了进程执行的先后顺序。 **5.7 进程组** - 如何将进程组织成组。 - 进程组可以简化管理和监控多个进程的工作。 ...

    一个我自己学习Erlang的聊天室服务器及客户端代码

    4. 消息传递:Erlang进程间通过消息传递进行通信,这在聊天室服务器中尤为关键。服务器进程会监听来自客户端的消息,如发送的文本、加入或离开房间的通知,然后将这些消息广播给其他在线用户。 二、Java聊天室...

Global site tag (gtag.js) - Google Analytics