Erlang (并发) 基础详解

-module(thread1).
-export([loop/0,rpc/2,start/0]).

start()->spawn(fun loop/0).


rpc(Pid,Request) ->
    %(客户机)向进程[服务器]异步发送一个请求
    %给进程Pid发送消息,self()是当前进程[客户机]的Pid
    Pid !{self(),Request},
    
    %(客户机)等待(服务器的[Pid进程])回应
    receive
        Reponse ->
            io:format("succeed4 "),
            %返回给调用方
            Reponse+1
    end.
    
    
loop()->
    io:format("succeed1 "),
    %等待消息到达,进行匹配
    receive
    {From1 ,{rectangle,Width,Ht}}->
        %向客户机异步发送请求
        From1 ! Width*Ht,
        io:format("succeed2  "),
        %匹配成功,继续下次消息匹配
        loop();
    {From1 ,_Other}->
        %向客户机发送请求
        From1 ! -1,   
        %匹配不成功,继续下次消息匹配
        loop()
    end    .
    
    
    %调用 
    % Pid=thread1:start().
    % thread1:rpc(Pid,{rectangle,6,9}).

 

添加在客户机(进程)等待响应时候,根据绑定的Pid进行匹配,把其他线程(不是服务器[或者说不是函数调用的])的过滤掉

-module(thread2).
-export([loop/0,rpc/2,start/0]).

start()->spawn(fun loop/0).


rpc(Pid,Request) ->
	%(客户机)向进程[服务器]异步发送一个请求
	%给进程Pid发送消息,self()是当前进程[客户机]的Pid
	Pid !{self(),Request},
	
	%(客户机)等待(服务器的[Pid进程])回应
	receive
		%进入rpc函数的时候,Pid会绑定到某个值,因此{Pid,Reponse}中,Pid是绑定的
		%而Response是自由的
		%这个模式仅会匹配包含二元组而且元二祖第一个元素的Pid的消息
		{Pid,Reponse} ->
			
			%返回给调用方
			Reponse
	end.
	
	
loop()->
	io:format("succeed1 "),
	%等待消息到达,进行匹配
	receive
	{From1 ,{rectangle,Width,Ht}}->
		%向客户机异步发送请求
		From1 !{ self(),Width*Ht},
		
		%匹配成功,继续下次消息匹配
		loop();
	{From1 ,Other}->
		%向客户机发送请求
		From1 !{ self(),{error,Other}},   
		%匹配不成功,继续下次消息匹配
		loop()
	end	.
	
	
	%调用 
	% Pid2=thread2:start().
	% thread2:rpc(Pid2,{rectangle,6,9}).

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值