`

Erlang入门(三)——分布式编程

阅读更多
    明天要回家一个星期了,好好休息下。今天找到别人翻译的Erlang编程手册,值的好好读一遍。
    所谓分布式的Erlang应用是运行在一系列Erlang节点组成的网络之上。这样的系统的性质与单一节点上的Erlang系统并没有什么不同。分布式这是个“大词”,Erlang从语言原生角度支持分布式编程,相比于java简单不少。
一、分布式机制
下列的BIFs是用于分布式编程:
spawn(Node, Mod, Func, Args)
启动远程节点的一个进程

spawn_link(Node, Mod, Func, Args)
启动远程节点的一个进程并创建连接到该进程

monitor_node(Node, Flag)
如果Flag是true,这个函数将使调用(该函数)的进程可以监控节点Node。如果节点已经舍弃或者并不存在,调用的进程将收到一个{nodedown,Node}的消息。如果Flag是false,监控将被关闭

node()
返回我们自己的进程name

nodes()
返回其他已知的节点name列表

node(Item)
返回原来Item的节点名称,Item可以是Pid,引用(reference)或者端口(port)

disconnect_node(Nodename)
从节点Nodename断开。

    节点是分布式Erlang的核心概念。在一个分布式Erlang应用中,术语(term)节点(node)意味着一个可以加入分布式 transactions的运行系统。通过一个称为net kernal的特殊进程,一个独立的Erlang系统可以成为一个分布式Erlang系统的一部分。当net kernal进程启动的时候,我们称系统是alive的。

    与远程节点上的进程进行通信,与同一节点内的进程通信只有一点不同:
java 代码
  1. {Name, Node} ! Mess.  
  
显然,需要接收方增加一个参数Node用于指定接受进程所在的节点。节点的name一般是用@隔开的atom类型,比如pong@dennis,表示计算机名为dennis上的pong节点。通过执行:
java 代码
  1. erl -sname pong  

将在执行的计算机中创建一个节点pong。为了运行下面的例子,你可能需要两台计算机,如果只有一台,只要同时开两个Erlang系统并以不同的节点名称运行也可以。

二、一些例子。
    这个例子完全来自上面提到的翻译的连接,关于分布式编程的章节。我增加了截图和说明。
首先是代码:
java 代码
 
  1. -module(tut17).  
  2.   
  3. -export([start_ping/1, start_pong/0,  ping/2, pong/0]).  
  4.   
  5. ping(0, Pong_Node) ->  
  6.     {pong, Pong_Node} ! finished,  
  7.     io:format("ping finished~n", []);  
  8.   
  9. ping(N, Pong_Node) ->  
  10.     {pong, Pong_Node} ! {ping, self()},  
  11.     receive  
  12.         pong ->  
  13.             io:format("Ping received pong~n", [])  
  14.     end,  
  15.     ping(N - 1, Pong_Node).  
  16.   
  17. pong() ->  
  18.     receive  
  19.         finished ->  
  20.             io:format("Pong finished~n", []);  
  21.         {ping, Ping_PID} ->  
  22.             io:format("Pong received ping~n", []),  
  23.             Ping_PID ! pong,  
  24.             pong()  
  25.     end.  
  26.   
  27. start_pong() ->  
  28.     register(pong, spawn(tut17, pong, [])).  
  29.   
  30. start_ping(Pong_Node) ->  
  31.     spawn(tut17, ping, [3, Pong_Node]).  

    代码是创建两个相互通信的进程,相互发送消息并通过io显示在屏幕上,本来是一个单一系统的例子,现在我们让两个进程运行在不同的两个节点上。注意 start_ping方法,创建的进程调用ping方法,ping方法有两个参数,一个是发送消息的次数,一个就是远程节点的name了,也就是我们将要 创建的进程pong的所在节点。start_pong创建一个调用函数pong的进程,并注册为名字pong(因此在ping方法中可以直接发送消息给 pong)。
    我是在windows机器上测试,首先打开两个cmd窗口,并cd到Erlang的安装目录下的bin目录,比如C:\Program Files\erl5.5.3\bin,将上面的程序存为tut17.erl,并拷贝到同一个目录下。我们将创建两个节点,一个叫 ping@dennis,一个叫pong@dennis,其中dennis是我的机器名。见下图:

采用同样的命令

erl 
-sname ping

创建ping节点。然后在pong节点下执行start_pong():


OK,这样就在节点pong上启动了pong进程,然后在ping节点调用start_ping,传入参数就是pong@dennis
java 代码
 
  1. tut17:start_ping(pong@dennis).  

执行结果如下图:

同样在pong节点上也可以看到:


    结果如我们预期的那样,不同节点上的两个进程相互通信如此简单。我们给模块tut17增加一个方法,用于启动远程进程,也就是调用spawn(Node,Module,Func,Args)方法:
java 代码
 
  1. start(Ping_Node) ->  
  2.     register(pong, spawn(tut17, pong, [])),  
  3.     spawn(Ping_Node, tut17, ping, [3, node()]).  

pong进程启动Ping_Node节点上的进程ping。具体结果不再给出。



    
分享到:
评论

相关推荐

    erlang入门学习经典资料(很不错)

    这种神秘感不仅源于它独特的编程范式——函数式编程,还在于其背后的开发历史以及为何能够从众多编程语言中脱颖而出,成为电信领域乃至分布式系统的宠儿。 #### Erlang 的发展历程 - **起始与发展**:Erlang的故事...

    erlang书籍

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,用于构建高可用性、分布式和实时系统。Erlang的设计灵感来源于Prolog,并且内置了处理大量并发连接的能力,因此在现代互联网服务和大...

    erlang资源

    这个“erlang资源”包含两本PDF书籍——《Erlang并发编程》和《Erlang入门手册》,它们是深入理解和学习Erlang语言的关键资料。 《Erlang并发编程》这本书可能涵盖了以下知识点: 1. **并发模型**:Erlang的并发...

    两本erlang电子书

    第二部分深入探讨OTP,讲解其设计原则和组件,如行为(Behaviours)、分布式编程和监控。最后,第三部分通过构建实际项目,演示如何在实际环境中应用Erlang和OTP,涵盖了从系统设计到部署的全过程。 《Erlang程序...

    Pragmatic.Programming.Erlang.2nd.Edition

    Erlang是一种功能强大的并发编程语言,特别适合开发分布式、容错性强且需要高度可伸缩性的系统。它最初由爱立信公司为电信系统设计,并逐渐被广泛应用于各种领域,如Web服务器、即时通信、游戏服务器等。 #### 三、...

    Erlang文档资料大集合

    例如,`Erlang快速入门中文版.pdf`可能是对英文版`Getting_Started`的翻译,帮助读者理解并发编程的核心概念——轻量级进程(processes)和消息传递。 在学习Erlang时,了解其核心特性至关重要。Erlang的并发模型...

    erlang的翻译文档

    - **分布式编程**:介绍如何构建分布式应用程序。 - **示例程序**:提供了一个大型的并行编程示例。 - **健壮性**:探讨了Erlang中处理异常和错误的策略。 - **超时**:讨论了如何处理长时间等待的情况。 - **...

    RabbitMQ从入门到放弃

    ### RabbitMQ从入门到放弃——理解消息队列与RabbitMQ #### 消息队列简介 消息队列(Message Queue, MQ)作为一种重要的中间件技术,它提供了应用程序间的一种通信方式,通过写入和读取出入列队的消息来进行通信,...

    Seven Languages in Seven Weeks.pdf

    - 这个标题非常直观地传达了本书的核心内容与目标——在短短七周的时间内,带领读者学习七种不同的编程语言。 #### 描述解析 - **描述**:本书由Bruce A. Tate撰写,由Pragmatic Bookshelf出版社出版,旨在帮助...

Global site tag (gtag.js) - Google Analytics