Erlang receive 处理原理

  1. loop(State) ->  
  2.     receive   
  3.         apple when State == 3 ->  
  4.             io:format("Apple~n"),  
  5.             loop(2);  
  6.         android when State == 2 ->  
  7.             io:format("Android~n"),  
  8.         loop(1);  
  9.         wp when State == 1 ->  
  10.             io:format("Wp~n"),  
  11.             loop(3)  
  12.     end.  
  13.   
  14. test() ->  
  15.     PID = spawn(fun() -> loop(1) end),  
  16.     PID ! apple,  
  17.     PID ! android,  
  18.     PID ! wp,  
  19.     ok.

求运行test()的输出。(答案:

Wp Apple Android

解析:遇见一个receive表达式,从信箱中取出一条消息(队列中的第一条消息),拿消息跟receive表达式中的第一个子句进行模式匹配,如果匹配成功,则绑定变量,执行与该子句关联的表达式,匹配结束,并将消息从信箱中删除。如果匹配失败,则拿该消息与receive中的第二个子句进行匹配,直到所有模式都匹配完毕。这个过程中如果有一个子句匹配成功,则执行与该子句关联的表达式,匹配结束,并将消息从信箱中删除;如果所有匹配都失败,那么该消息仍旧放回队列(原来的位置上),取出信箱中的第二条消息,再依次与receive表达式中的子句进行匹配。如果队列中的所有消息都匹配过了(有些匹配成功的已经从队列中删除,匹配失败的仍保留在队列中),此时不管队列中还有没有消息,Erlang进程都会阻塞住,直到队列中有新的消息到来,进程被唤醒,上述流程继续。(原文链接:http://fengchangjian.com/?p=1899)

转载于:https://www.cnblogs.com/tianxincode/p/7017620.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值