如果不是它駭人聽聞的並行效能,幾乎不會考慮去學習這麼一門語言。因為它的並行,我看到的是一塊用軟體寫出來的電路板,是的,它幾乎就是把電腦變成了乙個可以自由編寫邏輯的晶元。
例程來自這裡:
例1 體會concurrent
-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]).
我們看到,除了最後兩行,這其實和我們前面學到的沒什麼兩樣。。。最後兩行出現了乙個新鮮的bif,spawn(),他有三個引數:
1. 引數2所在的模組名
2. 啟動新程序後,執行哪個函式
3. 要傳遞給引數2的引數
兩個spawn()事實上只啟用了乙個新的程序,乙個用來執行say_something(hello, 3),乙個用來執行say_something(goodbye, 3)。當然,他們是在同時執行的:
>c(tut14).> tut14:say_something(hello, 3).
hello
hello
hello
done
>tut14:start().
hello
goodbye
<0.39.0>hello
goodbye
hello
goodbye
例2 傳送和接收訊息
通常意義上大家認為程序是獨立執行的,不共享任何資源;而執行緒是需要共享資源的。我們不共享資源,所以把這裡並行的叫做程序。但是,既然不共享資源,那該如何進行程序間通訊呢?事實上,機制是唯一的:訊息。我們可以根據程序的pid來傳送訊息,比如上面的<0.39.0>就是程序的pid。
-module(tut15).
-export([start/0, ping/2, pong/0]).
ping(0, pong_pid) ->pong_pid !finished,
io:format("ping finished~n", );
ping(n, pong_pid) ->pong_pid !,
receive
pong ->io:format("ping received pong~n", )
end,
ping(n - 1, pong_pid).
pong() ->
receive
finished ->io:format("pong finished~n", );
->io:format("pong received ping~n", ),
ping_pid !pong,
pong()
end.
start() ->pong_pid =spawn(tut15, pong, ),
spawn(tut15, ping, [3, pong_pid]).
上面的**裡出現了兩個生面孔:
1、pong_pid ! finished。這就是前面提到的傳送message。
2、receive...end。這句則是用來接收message;如pong()中的finished和則是兩項匹配條件,表示如果接收到的訊息是這個或者那個,然後如何如何。如果接收到的訊息是finished,那麼在io中輸出,pongfinished。
3、pong_pid是由spawn返回的,而ping_pid則是呼叫self()函式獲取的。
執行的結果是:
> c("tut15").>tut15:
module_info/0 module_info/1 ping/2 pong/0 start/0
>tut15:start().
pong received ping
<0.47.0>ping received pong
pong received ping
ping received pong
pong received ping
ping received pong
ping finished
pong finished
初次之外,還有乙個「別名」機制,我們使用register,來給程序起個名字,這樣我們在發訊息的時候,就不再是依據pid,使用名字就可以了。我們還是使用上面的例子,只是引入了register,而不再用pong_pid:
-module(tut15).
-export([start/0, ping/1, pong/0]).
ping(0) ->pong !finished,
io:format("ping finished~n", );
...start() ->register(pong, spawn(tut15, pong, )),
spawn(tut15, ping, [3]).
如上:register(some_atom, pid),第乙個引數是乙個atom,第二個引數是spawn返回來的程序id。
窺一斑而知全豹。
Markdown的初次使用
標題是標明文章和作品等內容的簡短語句。乙個 字元代表一級標題,以此類推。列表是一種由資料項構成的有限序列,即按照一定的線性順序排列而成的資料項的集合。1.對於無序列表,使用星號 加號或者減號作為列表標記.2.對於有序列表,則是使用數字 乙個空格 前後有兩個星號或下劃線表示加粗,前後有 3 個星號或下...
初次使用Spring quartz
最近由於公司人力資源部門的需要,由於公司每天的 太多,想做乙個定時的自動歸檔報表的功能,在我領導金導的幫助下,基本是實現了功能。下面是我自己總結的步驟 1 建立乙個spring task.xml 名字隨便 的xml檔案,配置如下 2 編寫autorunarchivedayserviceimpl類 這...
github初次使用
1 mkdir gitrepo 建立本地的倉庫資料夾 2 cd gitrepo 進入該長褲資料夾 3 git init 初始化本地倉庫 4 git add 新增要push到遠端倉庫的檔案或資料夾 5 git commit m first commit 提交剛剛新增的檔案,提交到本地倉庫 6 git ...