在Erlang里:
1,创建和销毁进程非常迅速
2,进程间发送消息非常迅速
3,在所有的操作系统间进程行为一致
4,可以创建大量的进程
5,进程之间不共享任何数据,彼此完全独立
6,进程间交互的唯一方法是消息传递
1,创建和销毁进程非常迅速
2,进程间发送消息非常迅速
3,在所有的操作系统间进程行为一致
4,可以创建大量的进程
5,进程之间不共享任何数据,彼此完全独立
6,进程间交互的唯一方法是消息传递
并发原语:共3个
Pid = spawn(Fun). 创建一个并发进程
Pid ! Message 向进程标示符为Pid的进程发送异步消息。! 是发送操作符。
发送者无需等待返回结果就可以继续处理它自己的事务。
receive ... end 接收一个发给当前进程的消息。
- receive
- Pattern1 [when Guard1] ->
- Expressions1;
- Pattern2 [when Guard2] ->
- Expressions2;
- ...
- after Time ->
- Expressions
- end
实例1:area_server0.erl
-module(area_server0).
-export([loop/0]).
loop() ->
receive
{rectangle,Width,Height} ->
io:format("Area of rectangle is ~p~n",[Width * Height]),
loop();
{circle,Radius} ->
io:format("Area of circle is ~p~n",[3.14*Radius*Radius]),
loop();
Other ->
io:format("I don't know the area of ~p~n",[Other]),
loop()
end.
运行:
1> c(area_server0).
{ok,area_server0}
2> Pid = spawn(fun area_server0:loop/0).
<0.39.0>
3> Pid!{rectange,3,4}.
I don't know the area of {rectange,3,4}
{rectange,3,4}
4> Pid!{rectangle,3,4}.
Area of rectangle is 12
{rectangle,3,4}
5> Pid!{circle,2}.
Area of circle is 12.56
{circle,2}
客户/服务器:
服务器需要知道客户端的Pid,才知道把返回的信息发送给谁。Client-Server通信时需要通过self()传递client端Pid
rpc(remote procedure call)远程过程调用,用于发送请求和等待回应。
下面对实例1进行改进:area_server1.erl
-module(area_server1).
-export([rpc/2,
loop/0]).
%%远程过程调用,客户端进程的函数
rpc(Pid,Request) ->
Pid!{self(),Request},
receive
{Pid,Response} ->
Response
end.
%%服务器端进程的函数
loop() ->
receive
{From,{rectangle,Width,Height}} ->
From!{self(),Width*Height}, %%向客户端发送响应数据
loop();
{From,{circle,R}} ->
From!{self(),3.14*R*R},
loop();
{From,Other} ->
From!{self(),{error,Other}},
loop()
end.
运行:
1> c(area_server1).
{ok,area_server1}
2> Pid = spawn(fun area_server1:loop/0).
<0.40.0>
3> area_server1:rpc(Pid,{rectangle,3,4}).
12
4> area_server1:rpc(Pid,{cicle,4}).
{error,{cicle,4}}