erlang receive 理解和幾個(gè)簡(jiǎn)單測(cè)試?yán)?/h2>

關(guān)于receive的理解,總算理解到了,相關(guān)見erlang面試題中receive的理解。
下面給出三個(gè)例子
第一個(gè)例子來實(shí)現(xiàn):

  • 清空郵箱一個(gè)消息
  • 清空郵箱一個(gè)指定消息
  • 清空郵箱所有消息

來證明

  • receive 只會(huì)遍歷郵箱一次;下一次遍歷,是在受到新消息的時(shí)候
  • 遍歷郵箱的時(shí)候,匹配到一個(gè),立刻結(jié)束匹配的過程,不回繼續(xù)進(jìn)行
  • 不加after語句的話,receive 遍歷郵箱完畢,如果沒有匹配到,就會(huì)阻塞在receive這里;如果匹配到了,就會(huì)執(zhí)行receive end后面的代碼塊;

第二個(gè)例子是實(shí)現(xiàn)消息先后順序接受的實(shí)現(xiàn),即:
只能處理消息'a'后,才能開始處理消息'b';
如果消息'b'先到,那么不會(huì)處理

第三個(gè)例子是實(shí)現(xiàn)消息的優(yōu)先級(jí)的接受,來自
《learn you some erlang for great good》

例子1:

%%%-------------------------------------------------------------------
%%% @author mohe
%%% @copyright (C) 2016, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 02. 九月 2016 下午3:07
%%%-------------------------------------------------------------------
-module(test).
-author("mohe").
%% API
-compile(export_all).
init() ->  %%初始化
  Pid = spawn(fun() -> loop() end),
  register(test, Pid).
loop() -> %%主循環(huán)
  io:format("loop in"),
  receive
    ok ->
      io:format("receive ok,begin process"),
      io:format("receive ok,begin end"),
      loop();
    'flush' ->
      flush(),
      loop();
    {'flush', Msg} ->
      flush(Msg),
      loop();
    'flush_all' ->
      flush_all()
  end.
flush() ->  %%清除一個(gè)消息
  receive
    Msg ->
      io:format("flush:~p", [Msg])
  after 0 ->
    ok
  end.
flush(Msg) ->  %%清除一個(gè)指定消息
  receive
    Msg ->
      io:format("flush:~p", [Msg])
  after 0 ->
    ok
  end.
flush_all() ->    %%清除所有的消息
  receive
    Msg ->
      io:format("flush:~p", [Msg]),
      flush_all()
  after 0 ->
    ok
  end.

運(yùn)行過程
<pre>
test:init(). //初始化
test!ok1. //發(fā)送'ok1'消息
test!ok2. //發(fā)送'ok2'消息
test!ok3. //發(fā)送'ok3'消息
test!ok1. //發(fā)送'ok1'消息
erlang:process_info(whereis(test),messages). //查看郵箱結(jié)果,結(jié)果為:{messages,[ok1,ok2,ok3,ok1]}
//清空郵箱一個(gè)消息
test!flush.
erlang:process_info(whereis(test),messages). //查看郵箱結(jié)果,結(jié)果為:{messages,[ok2,ok3,ok1]},
證明郵箱消息順序是按序到達(dá)的

// 清空郵箱指定消息
test!ok1. //發(fā)送'ok1'消息
erlang:process_info(whereis(test),messages).

{messages,[ok2,ok3,ok1,ok1]}
test!{flush,'ok1'}.
erlang:process_info(whereis(test),messages).
{messages,[ok2,ok3,ok1]
說明只會(huì)遇到匹配成功后,立刻停止匹配過程,
因?yàn)槠ヅ淝坝袃蓚€(gè)'ok1',匹配后,還剩下一個(gè)'ok1'
</pre>

例子2

receive
  'a' ->
    io:format("receive and process msg:~")
    receive
       'b' ->
          io:format("receive and process msg:~")
    end
end.

例子3

-module(multiproc).
important() ->
receive
{Priority, Message} when Priority > 10 ->
[Message | important()]
after 0 ->
normal()
end.
 
normal() ->
receive
{_, Message} ->
[Message | normal()]
after 0 ->
[]
end.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,715評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,366評(píng)論 25 708
  • 世界是并行的,Erlang程序反應(yīng)了我們思考和交流的方式,人作為個(gè)體通過發(fā)送消息進(jìn)行交流,如果有人死亡,其他人會(huì)注...
    abel_cao閱讀 2,868評(píng)論 1 4
  • 今天是周日,昨天和今天發(fā)生的兩件小事讓槽點(diǎn)君突然想上來更新一下,關(guān)于個(gè)人發(fā)展戰(zhàn)略最新版本的一個(gè)雛形想法。 兩件小事...
    槽點(diǎn)君Ezra閱讀 195評(píng)論 1 1
  • 徐志摩不是好老公?那是對(duì)于張幼儀。 而對(duì)于陸小曼,他滿足我對(duì)于好男人的所有想象。 不信?來看看…… 01.先看顏值...
    淡一典閱讀 3,279評(píng)論 17 44

友情鏈接更多精彩內(nèi)容