一、郵箱的概念
① 每個程序都帶有乙個郵箱,這個郵箱是和程序同步建立的。
② 給某個程序傳送訊息後,訊息會被放入該程序的郵箱。只有當程式執行第一條接收語句時才會讀取郵箱。
二、問題的疑惑
源** 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...