Erlang 超時為0的接收 疑問與詳解

2021-09-17 08:24:50 字數 1615 閱讀 9726

一、郵箱的概念

① 每個程序都帶有乙個郵箱,這個郵箱是和程序同步建立的。

② 給某個程序傳送訊息後,訊息會被放入該程序的郵箱。只有當程式執行第一條接收語句時才會讀取郵箱。

二、問題的疑惑

源** tester.erl

-module(trec).

-export([start/0]).

start() ->

receive

-> io:format("bbb")

after 0 ->

receive

any -> io:format("***")

endend.

c(trec).

pid = spawn(trec, start, ).

pid ! .

> ***.

當郵箱**現 時會優先處理對應的表示式並返回,只有當模式匹配都完成後,才能執行 after 0 後面的部分。

那為什麼向該程序傳送了 卻沒有列印出 bbb,反而列印出 *** 並退出了該程序。

原因:spawn() 建立程序的同時,執行了程式**,一旦程式**執行,就會立即讀取郵箱的訊息,而此時,pid ! 的訊息還沒有傳送給該程序,因此郵箱訊息為空,直接執行了 after 0 後面的語句,接收到任一乙個引數,就輸出 *** 並退出程序。

換個方式看看:

c(trec).

self() ! . % 向當前shell的程序郵箱傳送一條訊息

trec:start(). % 執行**,讀取當前程序的郵箱,能獲取到訊息

> bbbok

分享一段**分析:

-module(multiproc).

-export([important/0]).

important() ->

receive

when priority > 10 ->

[message | important()]

after 0 ->

normal()

end.

normal() ->

receive

->

[message | normal()]

after 0 ->

end.

1> c(multiproc).

2> self() ! , self() ! , self() ! , self() ! .

% 依次向當前shell程序郵箱傳送 訊息

3> multiproc:important().

[high,high,low,low]

% 由於第乙個訊息 條件1,則執行表示式,並將該訊息從郵箱內刪除。由於第2、3條訊息 不滿足條件1,保留在郵箱的「儲存佇列」內並從郵箱裡刪除,第4條滿足則執行表示式並從郵箱裡刪除。然後執行 after 的**,讀取郵箱內剩餘的 2、3 條訊息,得到最終結果

setTimeout為0的作用

但settimeout f,0 的作用很簡單,就是為了把f放到執行佇列的最後去執行。也就是說,無論settimeout f,0 寫在哪,都可以保證在佇列的最後執行。js解析器會把settimeout f,0 裡的f壓到佇列的最後,因為它是非同步操作。settimeout第二個引數為0表示立即執行。當...

Oracle ascii為0的陷阱

ascii0是個空字元,如果將這個字元插入到oracle資料庫中會是什麼現象,是null嗎?建立一張測試表 create table test id int,name varchar2 10 comm varchar2 30 向這張測試表中插入以下資料 insert into test values...

關於接收訊息的問題(尚有疑問,未完待續)

由於接收訊息必須要有hwnd,也就是需要有個視窗對應才能接收訊息,但有些情況下不需要這個視窗卻又想要能夠接收訊息,找了下,大概有這麼些辦法 1 在乙個bcb版塊看到有個人提問在dll中不用視窗怎麼接收訊息的乙個回答 自定義乙個視窗控制代碼 申請 allocatehwnd 釋放 deallocateh...