先來討論erlang中的process.
這是屬於erlang的process,不是OS的process.
erlang的process具有以下特點:
在erlang中要建立一個process,最簡單的方式是使用spawn(Fun).
進入erlang shell.看互動式的方式建立.
1> F = fun() -> 1 + 1 end.
#Fun<erl_eval.20.90072148>
產生新的process.
2> spawn(F).
<0.36.0>
Shell回報了剛建立的process的pid.
一般我們會使用 Pid = spawan(Fun). 將Pid紀錄起來.
3> spawn(fun() -> io:format("~p~n", [1 + 1]) end).
2
<0.38.0>
產生一個列印出計算結果的process.
processes之間靠message來溝通,發送用 Pid ! Message 方式,
接收端用
receive
Pattern1 [when Guard1] ->
Expressions1;
Pattern2 [when Guard2] ->
Expressions2;
...
end
方式對應.
我們來看一個範例,會產生一個process,根據我們透過erlang shell傳給他的
message 來對應.
-module(e1013a).
-export([loop/0]).
loop() ->
receive
{arale} ->
io:format("She is 139 cm tall~n"),
loop();
{doraemon} ->
io:format("He is 129.3 cm tall~n"),
loop();
Other ->
io:format("I don't know about ~p~n", [Other]),
loop()
end.
編譯及執行後互動:
1> c(e1013a).
{ok,e1013a}
2> Pid = spawn(fun e1013a:loop/0).
<0.40.0>
3> Pid ! {arale}.
She is 139 cm tall
{arale}
4> Pid ! {doraemon}.
He is 129.3 cm tall
{doraemon}
5> Pid ! {ironman}.
I don't know about {ironman}
{ironman}
這個新建立的process,依照我們傳進去的訊息,
做出相對應的回應.
接著再來看一個例子.我們來產生數個processes.
6> G = fun(X) -> timer:sleep(10), io:format("~p~n", [X]) end.
#Fun<erl_eval.6.90072148>
7> [spawn(fun() -> G(X) end) || X <- lists:seq(1,10)].
[<0.46.0>,<0.47.0>,<0.48.0>,<0.49.0>,<0.50.0>,<0.51.0>,
<0.52.0>,<0.53.0>,<0.54.0>,<0.55.0>]
10
9
7
5
8
6
4
3
2
1
產生新processes的pid,都存在List裡面.列印出來的數字.
沒有依照順序,因為我們的Erlang VM是使用SMP.