Erlang 進(jìn)程

2021-12-24 14:11 更新

Erlang進(jìn)程管理

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

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

Erlang 的內(nèi)置函數(shù) spawn 可以用來創(chuàng)建一個(gè)新的進(jìn)程: spawn(Module, Exported_Function, List of Arguments)。假設(shè)有如下這樣一個(gè)模塊:

-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ù)第二個(gè)參數(shù)指定的次數(shù)將第一個(gè)參數(shù)的值輸出多次。函數(shù) start 啟動(dòng)兩個(gè) Erlang 進(jìn)程,其中一個(gè)將 “hello” 輸出 3 次,另一個(gè)進(jìn)程將 “goodbye” 輸出三次。所有的進(jìn)程中都調(diào)用了 say_something 函數(shù)。不過需要注意的是,要想使用一個(gè)函數(shù)啟動(dòng)一個(gè)進(jìn)程,這個(gè)函數(shù)就必須導(dǎo)出此模塊,同時(shí)必須使用 spawn 啟動(dòng)。

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

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

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

spawn 返回的是進(jìn)程的標(biāo)識(shí)符,簡(jiǎn)記為 pid。進(jìn)程標(biāo)識(shí)符是用來唯一標(biāo)識(shí) Erlang 進(jìn)程的標(biāo)記。所以說,<0.63.0> 也就是 spawn 返回的一個(gè)進(jìn)程標(biāo)識(shí)符。下面一個(gè)例子就可會(huì)講解如何使用進(jìn)程標(biāo)識(shí)符。

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)