大家好,欢迎来到IT知识分享网。
erlang中的并发编程与进程之间的消息传递,一直是erlang中的难点,搞了这么多天,本人还是没有完全吃透,于是打算写个文章,加深一下印象。
erlang的并发在于进程,进程是erlang的精华所在,并发也就是并行,你在运行我也在运行,两个进程之间进行交流只能靠发送消息,基本格式如下
Pid ! Message
receive
….
end
接下来,我们来做一个具体的实现,来看看效果。
-module(concurrent).
-export([loop/0,createProcess/0]).
loop()->
receive
{move,Distance}->
io:format(“I come from the city far with ~p~n”,[Distance]),
loop();
{jump,Distance}->
io:format(“I can jump:~p~n”,[Distance*2]),
loop();
[stop,Time]->
io:format(“the time is pass:~p~n”,[Time]),
loop()
end.
%%方法返回是Pid
createProcess()->
spawn(fun concurrent:loop/0).
然后我们编译 再执行一下
1> Pid=concurrent:createProcess().
<0.80.0>
2> Pid ! {move, 100}.
I come from the city far with 100
{move,100}
先创建一个进程, 然后再向进程发消息,获取返回值 I come from the city far with 100,
咱们再来看一个实例,理解会更加透彻一点。
再看一下 spawn函数的完整用法 Pid = spawn(Module, FunctionName, ArgumentList)
spawn接受三个参数:模块名,函数名以及参数列表,并返回一个代表创建的进程的标识符(Pid)。
如果在一个已知进程Pid1中执行:Pid2 = spawn(Mod, Func, Args),那么,Pid2仅仅能被Pid1可见,Erlang系统的安全性就构建在限制进程扩展的基础上。
如何接受特定进程的消息呢,将发送方(sender)也附送在消息当中,接收方通过模式匹配决定是否接受,比如:Pid!{self(),ddd},给进程Pid发送消息{self(),ddd},然后接收方:
receive
{Pid1,Msg} ->
end
通过模式匹配决定只有Pid1进程发送的消息才接受。 下面再来一个例子
-module(areaserver). %%定义模块
-export([loop/0,rpc/2]).%%导出函数
%%发送消息 监听返回值
rpc(Pid,Request)->
Pid!{self(),Request},%%向指定进程发送消息
receive
Response-> %%接受消息处理
io:format(“Response~n”,[]),%%这是我特意加的 消息标记
Response
end.
%%开启指定数据的消息监听
loop()->
receive
{From,{Rectangle,Width,Ht}}->%%分类执行
From!Width*Ht,
loop();
{From,{circle,R}} ->%%分类执行
From ! 3.14159 * R * R,
loop();
{From,Other} ->%%其它情况
From ! {error,Other},
loop()
end.
好我们来执行一下
c(areaserver).%%编译一下
{ok,areaserver} %%编译成功
6> Pid=spawn(areaserver,loop,[]).%%创建进程 并获取到PId
8> areaserver:rpc(Pid,{rectangle,6.8}).
Response %%先获取到消息提示
{error,{rectangle,6.8}}%%再分支处理
10> areaserver:rpc(Pid,{rectangle,6,8}).%%这里计算两个数相乘 返回结果48
Response
48
到此,并发编程学习完毕,通过两个实例,明白了消息监听和传送,后续再分享ERLANG方面的知识。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/56636.html