第1章 Erlang教程_Erlang并发编程(试读)

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

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().

<>

2> Pid ! {move, }.

I come from the city far with

{move,}

先创建一个进程, 然后再向进程发消息,获取返回值 I come from the city far with ,

咱们再来看一个实例,理解会更加透彻一点。

再看一下 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 ! * 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,}).

Response %%先获取到消息提示

{error,{rectangle,}}%%再分支处理

> areaserver:rpc(Pid,{rectangle,6,8}).%%这里计算两个数相乘 返回结果

Response

到此,并发编程学习完毕,通过两个实例,明白了消息监听和传送,后续再分享ERLANG方面的知识。

原文链接:,转发请注明来源!