1. 程式人生 > >1.5 Erlang教程-併發

1.5 Erlang教程-併發

Erlang是一門併發程式語言——這意味著在Erlang中可直接對並行活動(程序)進行程式設計,並且其並行機制是由Erlang而不是宿主作業系統提供的。

為了對一組並行活動進行控制,Erlang提供了多程序原語:spawn用於啟動一個平行計算(稱為程序);send向一個程序傳送一條訊息;而receive從一個程序中接收一條訊息。

spawn/3啟動一個併發程序並返回一個可用於向該程序傳送訊息或從該程序接收訊息的識別符號。

Pid ! Msg語法用於訊息傳送。Pid是代表一個程序的身份的表示式或常量。Msg是要向Pid傳送的訊息。例如:

Pid ! {a, 12}

表示將訊息{a, 12}傳送至以Pid為識別符號的程序(Pid是程序識別符號process identifier的縮寫)。在傳送之前,訊息中的所有引數都先被求值,因此:

foo(12) ! math3:area({square, 5})

表示對foo(12)求值(必須返回一個有效的程序識別符號),並對math3:area({square, 5})求值,然後將計算結果(即25)作為一條訊息傳送給程序。send原語兩側表示式的求值順序是不確定的。

receive原語用於接收訊息。receive語法如下:

receive
    Message1 ->
        ... ;
    Message2 ->

        ... ;
        ...
end

這表示嘗試接收一個由Message1、Message2等模式之一描述的訊息。對該原語進行求值的程序將被掛起,直至接收到一個與Message1、Message2等模式匹配的訊息。一旦找到一個匹配,即對“->”右側的程式碼求值。

接收到訊息後,訊息接收模式中的所有未繫結變數都被繫結。

receive的返回值是被匹配上的接收選項所對應的語句序列的求值結果。

我們可以簡單認為send發生一條訊息而receive接收一條訊息,然而更準確的描述則是send將一條訊息傳送至一個程序的郵箱,而receive嘗試從當前程序的郵箱中取出一條訊息。

receive是有選擇性的,也就是說,它從等候接收程序關注的訊息佇列中取走第一條與訊息模式相匹配的訊息。如果找不到與接收模式相匹配的訊息,則程序繼續掛起直至下一條訊息到來——未匹配的訊息被儲存用於後續處理。