2008-05-06
将消息发送到另外一个节点上的进程
如果在节点node1中注册了一个进程
在本节点内给该进程发送消息是
在另外一个节点上给该进程发生消息是
接着玩个小把戏。
在FP中,函数和atom、整数、字符串等一样都是数据,这以为着我们可以像发送atom、字符串等一样将本地函数发送到另外一个节点上,然后执行。
首先机器(ip地址是10.0.0.11)启动节点1,执行如下命令:
然后在erl中定义接收消息的函数:
注意该函数只接收一条消息
创建并登记进程:
在另外一台机器(ip地址是10.0.0.12)上启动节点2:
然后定义作为消息发送出去的函数:
将该函数发送到节点1上:
可以在节点1看到收到F2并执行的结果。
这样任何一个函数都可以发布到任何网络中的一个节点上执行,并不一定非得在定义它的地方执行。
运行时更新代码的问题:传统的系统比较难以在运行时更新代码,一般都是停机,替换代码,重新启动完成系统的升级。Erlang号称提供热切换的特性,也就是说在系统不停机时就能更新部分代码,很神奇的样子。热切换机制也与FP函数的这种特点有关,函数与普通对象没有本质的区别,那么既然运行时修改对象不算什么问题,动态更新函数也就是理所当然的了。
由于Erlang变量的不可变性,但是函数可以参数的形式实现动态变化:
loop(Fun) ->
receive
{execute, Arg} ->
Fun(Arg),
loop(Fun);
{update_fun, New_Fun} ->
loop(New_Fun)
end.
当某线程运行此段代码后,该线程就会一直接收别的线程发消息给它,如果收到{execute, Arg}消息,将执行Fun函数,完成相关业务处理;处理完后线程继续等待接收新的消息;
如果要不停机更新代码,就给该进程发送{update_fun, NewFun}消息,NewFun即为要更新的函数。
register(test1, spawn(Fun)).
在本节点内给该进程发送消息是
test1 ! Msg.
在另外一个节点上给该进程发生消息是
{test1, nodeName@node1} ! Msg.
接着玩个小把戏。
在FP中,函数和atom、整数、字符串等一样都是数据,这以为着我们可以像发送atom、字符串等一样将本地函数发送到另外一个节点上,然后执行。
首先机器(ip地址是10.0.0.11)启动节点1,执行如下命令:
erl -name node1@10.0.0.11 -setcookie abc
然后在erl中定义接收消息的函数:
(node1@10.0.0.11)1> F1 = fun()->
(node1@10.0.0.11)1> receive
(node1@10.0.0.11)1> Fun-> io:format("I received !!!~n"), Fun()
(node1@10.0.0.11)1> end
(node1@10.0.0.11)1> end.
注意该函数只接收一条消息
创建并登记进程:
register(test1, spawn(fun() -> F1() end)).
在另外一台机器(ip地址是10.0.0.12)上启动节点2:
erl -name node2@10.0.0.12 -setcookie abc
然后定义作为消息发送出去的函数:
(node2@10.0.0.12)1> F2 = fun() -> io:format("HELLO WORLD~n") end.
将该函数发送到节点1上:
(node2@10.0.0.12)2> {test1, 'node1@10.0.0.11'} ! F2.
可以在节点1看到收到F2并执行的结果。
这样任何一个函数都可以发布到任何网络中的一个节点上执行,并不一定非得在定义它的地方执行。
运行时更新代码的问题:传统的系统比较难以在运行时更新代码,一般都是停机,替换代码,重新启动完成系统的升级。Erlang号称提供热切换的特性,也就是说在系统不停机时就能更新部分代码,很神奇的样子。热切换机制也与FP函数的这种特点有关,函数与普通对象没有本质的区别,那么既然运行时修改对象不算什么问题,动态更新函数也就是理所当然的了。
由于Erlang变量的不可变性,但是函数可以参数的形式实现动态变化:
loop(Fun) ->
receive
{execute, Arg} ->
Fun(Arg),
loop(Fun);
{update_fun, New_Fun} ->
loop(New_Fun)
end.
当某线程运行此段代码后,该线程就会一直接收别的线程发消息给它,如果收到{execute, Arg}消息,将执行Fun函数,完成相关业务处理;处理完后线程继续等待接收新的消息;
如果要不停机更新代码,就给该进程发送{update_fun, NewFun}消息,NewFun即为要更新的函数。
发表评论
- 浏览: 2176 次
- 性别:

- 来自: 北京

- 详细资料
搜索本博客
最新评论
-
Mnesia──一个用于电信应 ...
linliangyi2007 写道不知道哪里抄的! 不知道是该葱白,还是无语!这 ...
-- by theseus8054 -
关于真随机数生成器
随着半导体生产工艺的不断改进....赶快囤积劣质内存
-- by rubynroll -
关于真随机数生成器
引用RSA的书上介绍过一种随机数发生器,根据的是劣质内存芯片工作在高温下,其数据 ...
-- by gigix -
Mnesia──一个用于电信应 ...
不知道哪里抄的! 不知道是该葱白,还是无语!这样的东西如果中国军方能自行研发,倒 ...
-- by linliangyi2007 -
Mnesia──一个用于电信应 ...
学术论文?
-- by baibai326






评论排行榜