iT邦幫忙

DAY 13
1

蠻可愛的 Erlang 與 Elixir系列 第 13

Concurrent Programming

先來討論erlang中的process.
這是屬於erlang的process,不是OS的process.
erlang的process具有以下特點:

  • 建立與銷毀processes非常快速
  • processes之間傳遞message非常快速
  • 不管在哪個作業系統上,processes的行為一致
  • 我們可以同時建立非常大量的processes
  • processes之間完全獨立,不共享記憶體
  • porcesses之間互動只能透過message

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

歡迎進入 Concurrent World!


上一篇
Higher-order functions
下一篇
Concurrent的client server 方式以及產生process所需時間
系列文
蠻可愛的 Erlang 與 Elixir30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言