Erlang并发编程1

在Erlang里: 
1,创建和销毁进程非常迅速 
2,进程间发送消息非常迅速 
3,在所有的操作系统间进程行为一致 
4,可以创建大量的进程 
5,进程之间不共享任何数据,彼此完全独立 
6,进程间交互的唯一方法是消息传递

并发原语:共3个
Pid = spawn(Fun).        创建一个并发进程
Pid ! Message               向进程标示符为Pid的进程发送异步消息。! 是发送操作符。
                                        发送者无需等待返回结果就可以继续处理它自己的事务。
receive ... end               接收一个发给当前进程的消息。
  1. receive  
  2.   Pattern1 [when Guard1] ->  
  3.     Expressions1;  
  4.   Pattern2 [when Guard2] ->  
  5.     Expressions2;  
  6.   ...  
  7.   after Time ->  
  8.     Expressions  
  9. 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}}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值