主頁 > 知識(shí)庫 > Erlang中的注冊進(jìn)程使用實(shí)例

Erlang中的注冊進(jìn)程使用實(shí)例

熱門標(biāo)簽:武漢AI電銷機(jī)器人 外呼系統(tǒng)會(huì)封嗎 萬利達(dá)綜合醫(yī)院地圖標(biāo)注點(diǎn) 股票配資電銷機(jī)器人 在電子版地圖標(biāo)注要收費(fèi)嗎 地圖標(biāo)注如何弄全套標(biāo) 電銷機(jī)器人 深圳 南京電銷外呼系統(tǒng)哪家好 實(shí)體店地圖標(biāo)注怎么標(biāo)

之前看到 Erlang 中的注冊進(jìn)程時(shí),對注冊并不理解,主要是不理解注冊的原子的作用域。剛才突然想明白了:

復(fù)制代碼 代碼如下:

注冊進(jìn)程關(guān)聯(lián)的原子具有全局作用域

也就是說關(guān)聯(lián)了注冊進(jìn)程之后的原子可以全局被使用

Erlang 中的并發(fā)機(jī)制是通過消息郵箱實(shí)現(xiàn)的,進(jìn)程間進(jìn)行通訊的方式只有消息郵箱,而進(jìn)程間通訊需要知道進(jìn)程的進(jìn)程號(hào),而使用 spawn 產(chǎn)生新進(jìn)程時(shí)會(huì)返回新進(jìn)程的進(jìn)程號(hào)供使用。

一個(gè)最簡單的進(jìn)程間通信的程序如下

復(fù)制代碼 代碼如下:

-module(test).

start() ->
    spawn(?MODULE, loop, []).

loop() ->
    io:format("Waiting for new message.~n"),
    receive
        M -> io:format("New message: ~p~n", [M])
    end,
    loop().

在 Erlang Shell 中使用 c(test) 編譯這個(gè)模塊,之后就可以簡單的使用了.

在下面的代碼中,語句前面的注釋表示解釋,語句后面的注釋表示輸出值, % => 后面的值表示語句的返回值

復(fù)制代碼 代碼如下:

% 編譯這個(gè)模塊
c(test).

% 開啟無限循環(huán)
Pid = test:start().
% Waiting for new message.                             % 新進(jìn)程 spawn 后立刻運(yùn)行
% => 0.35.0>                                          % 返回新進(jìn)程的進(jìn)程號(hào)

% 向進(jìn)程發(fā)送消息
Pid ! 'message'.
% New message: message                                 % 接收到消息
% Waiting for new message.                             % 繼續(xù)接收消息
% => message                                           % 語句返回值,而非進(jìn)程返回消息


為了用戶不用每次都 Pid ! 'message',可以加入一個(gè) call 方法進(jìn)行包裝一下。
復(fù)制代碼 代碼如下:

call(Pid, M) ->
    Pid ! M.

這樣就可以使用 test:call(Pid, 'message') 發(fā)送消息了。

但是這樣寫還有個(gè)明顯的弊端,調(diào)用 call 時(shí)需要 Pid 參數(shù),但是又不能去掉,因?yàn)樾枰M(jìn)程號(hào)才能通信,所以使用時(shí)需要用戶維護(hù)一個(gè)進(jìn)程號(hào)。

而 Erlang 提供了注冊進(jìn)程的機(jī)制用來把原子關(guān)聯(lián)到進(jìn)程中,可以解決這個(gè)問題

使用 register(atom, Pid) 可以將 atom 關(guān)聯(lián)到進(jìn)程號(hào)為 Pid 的進(jìn)程上,這個(gè)原子就

修改上面的 start 函數(shù)為

復(fù)制代碼 代碼如下:

start() ->
    register(testp, spawn(?MODULE, loop, [])).

這樣,新的進(jìn)程將關(guān)聯(lián)到原子 testp,此時(shí)原子就可以當(dāng)作 Pid 那樣使用 "消息發(fā)送操作符" !
復(fù)制代碼 代碼如下:

testp ! 'message'

于是可以修改上面的 call 函數(shù),去掉 Pid 參數(shù),而使用關(guān)聯(lián)后的原子,這個(gè)關(guān)聯(lián)后的原子不止在模塊內(nèi)有效,在全局作用域中都是有效的。
復(fù)制代碼 代碼如下:

call(M) ->
    testp ! M.

因此使用注冊進(jìn)程修改后的程序如下
復(fù)制代碼 代碼如下:

-module(test).

start() ->
    register(testp, spawn(?MODULE, loop, [])).

loop() ->
    io:format("Waiting for new message.~n"),
    receive
        M -> io:format("New message: ~p~n", [M])
    end,
    loop().

call(M) ->
    testp ! M.


注冊相關(guān)的 BIF
復(fù)制代碼 代碼如下:

% 注冊 atom 到 Pid

register(atom, Pid).

% 取消 atom 的注冊
unregister(atom).

% 返回 atom 關(guān)聯(lián)的進(jìn)程號(hào),如果未關(guān)聯(lián),返回 undefined
whereis(atom).

% 返回系統(tǒng)中所有已注冊的進(jìn)程名
registered().

標(biāo)簽:濟(jì)源 濟(jì)寧 汕頭 臺(tái)州 安徽 廣東 泰安 武威

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Erlang中的注冊進(jìn)程使用實(shí)例》,本文關(guān)鍵詞  Erlang,中的,注冊,進(jìn)程,使用,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Erlang中的注冊進(jìn)程使用實(shí)例》相關(guān)的同類信息!
  • 本頁收集關(guān)于Erlang中的注冊進(jìn)程使用實(shí)例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章