关于erlang 并发编程的理解与实例展现

关于erlang 并发编程的理解与实例展现erlang中的并发编程与进程之间的消息传递,一直是erlang中的难点,搞了这么多天,本人还是没有完全吃透,于是打算写个文章,加深一下印象。

大家好,欢迎来到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).

然后我们编译 再执行一下

关于erlang 并发编程的理解与实例展现

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

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信