Erlang 進程

2021-12-24 14:11 更新

Erlang進程管理

相比于其它函數(shù)式編程語言,Erlang 的優(yōu)勢在于它的并發(fā)程序設計與分布式程序設計。并發(fā)是指一個程序中同時有多個線程在執(zhí)行。例如,現(xiàn)代操作系統(tǒng)允許你同時使用文字處理、電子制表軟件、郵件終端和打印任務。在任意一個時刻,系統(tǒng)中每個處理單元(CPU)都只有一個線程(任務)在執(zhí)行,但是可以通過以一定速率交替執(zhí)行這些線程使得這些它們看上去像是在同時運行一樣。Erlang 中創(chuàng)建多線程非常簡單,而且很容易就可以實現(xiàn)這些線程之間的通信。Erlang 中,每個執(zhí)行的線程都稱之為一個 process(即進程,注意與操作系統(tǒng)中的進程概念不太一樣)。

(注意:進程被用于沒有共享數(shù)據(jù)的執(zhí)行線程的場景。而線程(thread)則被用于共享數(shù)據(jù)的場景下。由于 Erlang 各執(zhí)行線程之間不共享數(shù)據(jù),所以我們一般將其稱之為進程。)

Erlang 的內(nèi)置函數(shù) spawn 可以用來創(chuàng)建一個新的進程: 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]).
5> c(tut14).
{ok,tut14}
6> tut14:say_something(hello, 3).
hello
hello
hello
done

如上所示,say_something 函數(shù)根據(jù)第二個參數(shù)指定的次數(shù)將第一個參數(shù)的值輸出多次。函數(shù) start 啟動兩個 Erlang 進程,其中一個將 “hello” 輸出 3 次,另一個進程將 “goodbye” 輸出三次。所有的進程中都調(diào)用了 say_something 函數(shù)。不過需要注意的是,要想使用一個函數(shù)啟動一個進程,這個函數(shù)就必須導出此模塊,同時必須使用 spawn 啟動。

9> tut14:start().
hello
goodbye
<0.63.0>
hello
goodbye
hello
goodbye

請注意,這里并不是先輸出 “hello” 三次后再輸出 “goodbye” 三次。而是,第一個進程先輸出一個 "hello",然后第二個進程再輸出一次 "goodbye"。接下來,第一個進程再輸出第二個 "hello"。但是奇怪的是 <0.63.0> 到底是哪兒來的呢?在 Erlang 系統(tǒng)中,一個函數(shù)的返回值是函數(shù)最后一個表達式的值,而 start 函數(shù)的第后一個表達式是:

spawn(tut14, say_something, [goodbye, 3]).

spawn 返回的是進程的標識符,簡記為 pid。進程標識符是用來唯一標識 Erlang 進程的標記。所以說,<0.63.0> 也就是 spawn 返回的一個進程標識符。下面一個例子就可會講解如何使用進程標識符。

另外,這個例子中 io:format 輸出用的不是 ~w 而變成了 ~p。引用用戶手冊的說法:“~p~w 一樣都是將數(shù)據(jù)按標準語法的格式輸出,但是當輸出的內(nèi)容需要占用多行時,~p 在分行處可以表現(xiàn)得更加智能。此外,它還會嘗試檢測出列表中的可輸出字符串并將按字符串輸出”。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號