erlang程序間通訊
程序間通訊
在Erlang中進行程序間通訊的唯一方法就是訊息傳遞。一個訊息通過原語!(send)傳送給另一個程序:
- Pid ! Message
Pid是要向其傳送訊息的程序的識別符號。任何合法的Erlang表示式都可以作為一個訊息傳送。send是一個會對其引數進行求值的原語。它的返回值是傳送的訊息。因此:
- foo(12) ! bar(baz)
會分別對foo(12)和bar(baz)進行求值得到程序識別符號和要傳送的訊息。如同其他的Erlang函式一樣,send對其引數的求值順序是不確定的。它會將訊息引數求值的結果作為返回值返回。傳送訊息是一個非同步操作,因此send既不會等待訊息送達目的地也不會等待對方收到訊息。就算髮送訊息的目標程序已經退出了,系統也不會通知傳送者。這是為了保持訊息傳遞的非同步性──應用程式必須自己來實現各種形式的檢查(見下文)。訊息一定會被傳遞到接受者那裡,並且保證是按照其傳送的順序進行傳遞的。
原語receive被用於接收訊息。它的語法如下:
- receive
- Message1 [when Guard1] ->
- Actions1 ;
- Message2 [when Guard2] ->
- Actions2 ;
- ...
- end
每個程序都有一個郵箱,所有傳送到該程序的訊息都被按照它們到達的順序依次儲存在郵箱裡。在上面的例子中,Message1和Message2是用於匹配程序郵箱中的訊息的模式。當找到一個匹配的訊息並且對應的保護式(Guard)滿足的時候,這個訊息就被選中,並從郵箱中刪除,同時對應的ActionsN會被執行。receive會返回ActionosN中最後一個表示式求值的結果。就如同Erlang裡其他形式的模式匹配一樣,訊息模式中未繫結(unbound)量會被繫結(bound)。未被receive選中的訊息會按照原來的順序繼續留在郵箱中,用於下一次recieve的匹配。呼叫receive的程序會一直阻塞,直到有匹配的訊息為止。
Erlang有一種選擇性接收訊息的機制,因此意外發送到一個程序的訊息不會阻塞其它正常的訊息。不過,由於所有未匹配的訊息會被留在郵箱中,保證系統不要完全被這樣的無關訊息填滿就變成了程式設計師的責任。