Erlang入门(三)—— 分布式编程
来源:互联网 发布:bpm软件价格 编辑:程序博客网 时间:2024/04/28 10:28
所谓分布式的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的。
与远程节点上的进程进行通信,与同一节点内的进程通信只有一点不同:
二、一些例子。
这个例子完全来自上面提到的翻译的连接,关于分布式编程的章节。我增加了截图和说明。
首先是代码:
代码是创建两个相互通信的进程,相互发送消息并通过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是我的机器名。见下图:
采用同样的命令
OK,这样就在节点pong上启动了pong进程,然后在ping节点调用start_ping,传入参数就是pong@dennis
同样在pong节点上也可以看到:
结果如我们预期的那样,不同节点上的两个进程相互通信如此简单。我们给模块tut17增加一个方法,用于启动远程进程,也就是调用spawn(Node,Module,Func,Args)方法:
一、分布式机制
下列的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的。
与远程节点上的进程进行通信,与同一节点内的进程通信只有一点不同:
{Name, Node} ! Mess.
显然,需要接收方增加一个参数Node用于指定接受进程所在的节点。节点的name一般是用@隔开的atom类型,比如pong@dennis,表示计算机名为dennis上的pong节点。通过执行:erl -sname pong
将在执行的计算机中创建一个节点pong。为了运行下面的例子,你可能需要两台计算机,如果只有一台,只要同时开两个Erlang系统并以不同的节点名称运行也可以。二、一些例子。
这个例子完全来自上面提到的翻译的连接,关于分布式编程的章节。我增加了截图和说明。
首先是代码:
-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]).
-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
tut17:start_ping(pong@dennis).
执行结果如下图:同样在pong节点上也可以看到:
结果如我们预期的那样,不同节点上的两个进程相互通信如此简单。我们给模块tut17增加一个方法,用于启动远程进程,也就是调用spawn(Node,Module,Func,Args)方法:
start(Ping_Node) ->
register(pong, spawn(tut17, pong, [])),
spawn(Ping_Node, tut17, ping, [3, node()]).
pong进程启动Ping_Node节点上的进程ping。具体结果不再给出。register(pong, spawn(tut17, pong, [])),
spawn(Ping_Node, tut17, ping, [3, node()]).
- Erlang入门(三)—— 分布式编程
- Erlang入门(二)— 并发编程
- Erlang入门(三)
- erlang 分布式编程问题
- Erlang分布式编程知识点
- erlang分布式编程总结
- Erlang分布式编程
- Erlang 分布式编程一
- Erlang—并发编程
- Erlang入门(五)—— 补遗
- Erlang入门备忘录(1):单行编程
- Erlang入门备忘录(2):并行编程
- erlang学习笔记:分布式编程
- Erlang编程快速入门
- Erlang——并发和分布式程序
- Erlang并发编程(三) --- 调试
- programming erlang 分布式编程spawn(Node, fun)
- Erlang入门(四)—— 错误处理和鲁棒性
- 姚明玩转火星文 囧字表情大集合(二)
- Erlang入门(一)
- Erlang入门(二)— 并发编程
- 十年
- 成长
- Erlang入门(三)—— 分布式编程
- 代码复制到VC6中时汉字出现乱码,解决方法竟然如此
- 啊啊啊啊
- CFileFind类的使用总结(转)
- Erlang入门(四)—— 错误处理和鲁棒性
- Erlang入门(五)—— 补遗
- C#中什么是元数据类型
- FW: 10家不错的iphone编程资源站
- 跟我一起学Visual Studio 2005系列课程(更新中...)