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方面的知识。