訊息傳遞

兩個 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