初次使用erlang的concurrent

2022-02-21 14:51:06 字數 2770 閱讀 5709

如果不是它駭人聽聞的並行效能,幾乎不會考慮去學習這麼一門語言。因為它的並行,我看到的是一塊用軟體寫出來的電路板,是的,它幾乎就是把電腦變成了乙個可以自由編寫邏輯的晶元。

例程來自這裡:

例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 ...