明天要回家一个星期了,好好休息下。今天找到别人翻译的
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 代码
显然,需要接收方增加一个参数Node用于指定接受进程所在的节点。节点的name一般是用@隔开的atom类型,比如pong@dennis,表示计算机名为dennis上的pong节点。通过执行:
java 代码
将在执行的计算机中创建一个节点pong。为了运行下面的例子,你可能需要两台计算机,如果只有一台,只要同时开两个Erlang系统并以不同的节点名称运行也可以。
二、一些例子。
这个例子完全来自上面提到的翻译的连接,关于分布式编程的章节。我增加了截图和说明。
首先是代码:
java 代码
- -module(tut17).
-
- -export([start_ping/1, start_pong/0, ping/2, pong/0]).
-
- ping(0, Pong_Node) ->
- {pong, Pong_Node} ! finished,
- io:format("ping finished~n", []);
-
- ping(N, Pong_Node) ->
- {pong, Pong_Node} ! {ping, self()},
- receive
- pong ->
- io:format("Ping received pong~n", [])
- end,
- ping(N - 1, Pong_Node).
-
- pong() ->
- receive
- finished ->
- io:format("Pong finished~n", []);
- {ping, Ping_PID} ->
- io:format("Pong received ping~n", []),
- Ping_PID ! pong,
- pong()
- end.
-
- start_pong() ->
- register(pong, spawn(tut17, pong, [])).
-
- start_ping(Pong_Node) ->
- 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 代码
- tut17:start_ping(pong@dennis).
执行结果如下图:
同样在pong节点上也可以看到:
结果如我们预期的那样,不同节点上的两个进程相互通信如此简单。我们给模块tut17增加一个方法,用于启动远程进程,也就是调用spawn(Node,Module,Func,Args)方法:
java 代码
- start(Ping_Node) ->
- register(pong, spawn(tut17, pong, [])),
- spawn(Ping_Node, tut17, ping, [3, node()]).
pong进程启动Ping_Node节点上的进程ping。具体结果不再给出。
分享到:
相关推荐
从Erlang.org的Programming rules翻译的中文版本
Clusterluck - 以node.js编写的类似于erlang的分散式分布式系统的库
如果你既想要erlang的并发分布式编程的理念又不喜欢erlang丑陋的停留在80年代的那种语法,又想要现代的性感的漂亮的时尚的Ruby/Python式的面向对象观而不满意其并发模型,那么,可以尝试Reia. 标签:Reia
erlang分布式 XMPP Seerlang分布式 XMPP Serverrvererlang分布式 XMPP Servererlang分布式 XMPP Server
erlang编程语言圣经 erlang从业人员的必备书籍 erlang语言开发入门
Erlang不但是一种编程语言,而且它具有比编程语言更加贴近操作系统的一些特性:并发线程、作业调度、内存管理、分布式、网络化等。据说使用Erlang编写的Yaws Web服务器,其并发性能是apache的15倍!
一本简约的Erlang语言入门书, 本书涵盖了从Erlang的起源到广泛应用的高可靠消息专递系统。
Erlang并发编程,Erlang程序设计,Erlang中文手册。 学习erlang的好资料。 Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此...
erlang入门电子书 erlang编程 Introducing Erlang,作者Simon.St.Laurent
NULL 博文链接:https://jianshi-dlw.iteye.com/blog/1179745
”, ——Steve Vinoski,《IEEE Internet Computing》专栏作家, 《Erlang编程指南》是对Erlang语言的深入介绍。Erlang是任何必须并发、容错和快速响应的环境的理想编程语言。随着多核处理器及其针对并发的新的可扩展...
Erlang入门:构建application练习5(监督树),以实例完全演示监督树的用法,Erlang入门必须知道的那点事
py 是为 Erlang 生态系统准备的分布式 Python。该项目有两个主要特性: Python 的简单封装接口,封装了 ErlPort 调用,可方便的进行: Make module-level calls Get module-level constants Instantiate ...
《erlang/otp并发编程实战》侧重生产环境下的erlang 开发,主要讲解如何构建稳定、版本控制良好、可维护的产品级代码,凝聚了三位erlang 大师多年的实战经验。 《erlang/otp并发编程实战》主要分为三大部分:第一...
Erlang入门:构建application练习3,实例演示如果构建一个最简单的Erlang Application
erlang是爱立信开发的程序开发语言,融合了函数式编程与面向对象编程,并行处理内建与程序语言内部,特别适合创建并发行、容错性、分布性要求比较高的软实时系统,掌握它程序员必备的一种编程技能,与它相似的语言...
关于Mykv是用Erlang / OTP编写的分布式键/值存储。 它使用Mnesia作为后端。 这个应用程式是为学习目的而建立,不适合在生产应用程式中使用。建造Mykv使用 。 $ git clone https://github.com/ferigis/mykv.git$ cd ...
在传统电信领域高并发、高可靠、高容错的严酷环境下,Erlang语言和OTP平台被锻炼得坚如磐石,浓郁的函数式特质更是恰到好处地弥补了传统命令式语言在并发编程上的固有缺陷,大大降低了构筑并发、容错、分布式应用的...
冰帽原作者:徐明勇( ) 这是 erlang PCAP NIF。 目前在 win7-8 和 WinPcap 4.1.2 上支持 erlang/x64。 警告:NIF 无效,并且会阻止 erlang VM。 为了获得更好的性能,请使用 epcap -- erlang 端口接口用于 PCAP: ...
天体 Celestial是主要为Nostale开发的MMORPG游戏服务器。 使用Kubernetes和Erlang作为现代,分布式,高度并发和容错系统的骨干。