使用erlang而不是其他函式式語言的乙個很主要的原因就是 erlang具有處理併發和分布式計算的程式設計能力。我們這裡說的併發是指程式可以在同乙個時點處理多個執行緒的執行。例如,現代作業系統可以允許你使用word的同時使用excel,並且還開著乙個電子郵件客戶端程式,乙個列印的任務在後台也在執行著。當然,對於系統中的每個處理器(cpu)來說同一時刻只能處理乙個執行緒(任務),但是當系統以一定的速率在不同的執行緒之間進行切換的時候,給人類的感覺就是這些任務都是在同一時間執行的。在乙個erlang程式中很容易建立乙個執行緒進行併發、並行的執行操作,執行緒之間的通訊也是非常容易的。在erlang系統中,我們稱每乙個執行的執行緒為process(注意這裡的特殊性,不要與其他系統中的程序相混淆)。
(注意:專有名詞「process」經常用於當執行的執行緒不與別的執行緒進行資料共享的情況對這種執行緒的稱呼。當這些執行緒之間共享資料時,我們一般把它們看作乙個整體,作為乙個process程序。在 erlang中,我們往往稱呼不共享資料的thread為process,並且很多時候是混合著叫的,讀者應該自己從上下文中進行分辨)
erlang的內建函式spawn被用來建立乙個新的程序:spawn (module,exported_function,list of arguments)。考慮下面的例子:
-module(tut14).
-export([start/0,say_something/2]).
say_something(what, 0) ->
done;
say_something(what, times) ->
io:format("~p~n",[what]),
say_something(what,times - 1).
start() ->
spawn(tut14,say_something,[hello,3]),
spawn(tut14,say_something,[goodbye,3]),
spawn(tut14,say_something,[qiao,3]),
spawn(tut14,say_something,[ning,3]).
我們可以看到函式say_something的第乙個引數表示要「說的話」,第二個引數表示說話的次數。現在我們來看看start函式,它首先啟動兩個erlang程序(注意:這裡的程序和作業系統的程序並不是一回事,有很大的差別,具體的內容我們會在後面的內容中進行介紹),乙個負責輸出「hello」3次,另乙個負責輸出「goodbye」3次。這些程序都是用函式sya_something。注意這個被spawn函式所使用的函式必須從模組中暴露出來,也就是說必須在模組中使用了- export語句暴露的函式。
1> c(tut14).
./tut14.erl:4: warning: variable 'what' is unused
2> tut14:start().
hello
goodbye
qiao
ning
<0.42.0>
hello
goodbye
qiao
ning
hello
goodbye
qiao
ning
3>
注意這裡並不是首先輸出「hello」三次,然後再輸出 「googdbye」三次,而是交替出現的。這裡的<0.63.0>(不同的執行環境和機器都會有不同的具體數值哈)從何而來?這個函式返回值當然是最後一件「事情」的返回值。在start函式中的最後一件事情是:
spawn(tut14, say_something, [goodbye, 3]).
函式spawn返回乙個程序識別符號(也就是耳熟能詳的pid),用來唯一表示乙個程序的。所以<0.63.0>是spawn函式被呼叫後返回的pid。我們將在下面的例子中使用到pid。
同樣注意到我們這裡在函式io:format中使用了「~p」代替「 ~w」。「~p」大體上和「~w」輸出是一致的,但是會將過長的可列印的片語切分為多行,並且明顯的縮排每行。這也是將可列印字元作為字串輸出的常見方法。
Erlang入門(二) 併發程式設計
erlang中的process 程序是輕量級的,並且程序間無共享。查了很多資料,似乎沒人說清楚輕量級程序算是什麼概念,繼續查詢中。閒話不提,進入併發程式設計的世界。本文算是學習筆記,也可以說是 concurrent programming in erlang 第五張的簡略翻譯。1.程序的建立 程序是...
erlang 併發程式設計 併發01
erlang純訊息傳遞式語言 特點 建立新程序 通過pid給次執行緒發訊息,mod模組,func方法,args傳入引數 pid spawn mod,func,args 新起乙個併發程序執行fun,fun的屬性是當前值 pid spawn fun 傳送訊息 pid message接受訊息 receiv...
Erlang程式設計快速入門
相當於 hello world 吧。原文在此 unix系統下輸入 erl windows系統下雙擊erlang的圖示。你應該會看類似下面的提示資訊 os prompt erl erlang r13b erts 5.7.1 smp 4 4 rq 4 async threads 0 kernel pol...