訊息傳遞
兩個 erlang 程序可以相互通訊,這也稱為訊息傳遞。
此過程是非同步的,其形式是傳送過程在傳送訊息後不會停止。
傳送訊息
這可以通過構造 Pid ! Message
來實現,其中 Pid
是有效的程序識別符號(pid),Message
是任何資料型別的值。
每個程序都有一個郵箱,其中包含收到的訂單中收到的郵件。這個郵箱可以通過 flush/0
功能的構建清空。
如果將訊息傳送到非現有程序,則將丟棄該訊息而不會出現任何錯誤!
示例可能如下所示,其中 self/0
返回當前程序的 pid,pid/3
建立 pid。
1> Pidsh = self().
<0.32.0>
2> Pidsh ! hello.
hello
3> flush().
Shell got hello
ok
4> <0.32.0> ! hello.
* 1: syntax error before: ’<’
5> Pidsh2 = pid(0,32,0).
<0.32.0>
6> Pidsh2 ! hello2.
hello2
7> flush().
Shell got hello2
ok
也可以使用 Pid3!Pid2!Pid1!Msg
一次向多個程序傳送訊息。
接收訊息
可以使用 receive
構造處理收到的訊息。
receive
Pattern1 -> exp11, .., exp1n1;
Pattern2 when Guard -> exp21, .., exp2n2;
...
Other -> exp31, .., exp3n3;
...
after Timeout -> exp41, .., exp4n4
end
Pattern
將與從第一個和最早的訊息開始的郵箱中的訊息進行比較。
如果模式匹配,則從郵箱中刪除匹配的訊息,並評估子句主體。
也可以使用 after
構造定義超時。
Timeout
要麼是以毫秒為單位的等待時間,要麼是原子 infinity
。
receive
的返回值是最後一個被評估的子句體。
示例(計數器)
帶有訊息傳遞的(非常)簡單計數器可能如下所示。
-module(counter0).
-export([start/0,loop/1]).
% Creating the counter process.
start() ->
spawn(counter0, loop, [0]).
% The counter loop.
loop(Val) ->
receive
increment ->
loop(Val + 1)
end.
與櫃檯互動。
1> C0 = counter0:start().
<0.39.0>
2> C0!increment.
increment
3> C0!increment.
increment