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)

posted @ 2017-06-15 14:35  tianxincode  阅读(1307)  评论(0编辑  收藏  举报