一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Erlang - Erlang中的注冊進程使用實例

Erlang中的注冊進程使用實例

2020-05-27 10:48腳本之家 Erlang

這篇文章主要介紹了Erlang中的注冊進程使用實例,本文給出正常進程通信實例和使用使用注冊進程通信實例,需要的朋友可以參考下

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

復制代碼 代碼如下:

注冊進程關聯的原子具有全局作用域


也就是說關聯了注冊進程之后的原子可以全局被使用

 

Erlang 中的并發機制是通過消息郵箱實現的,進程間進行通訊的方式只有消息郵箱,而進程間通訊需要知道進程的進程號,而使用 spawn 產生新進程時會返回新進程的進程號供使用。

一個最簡單的進程間通信的程序如下

復制代碼 代碼如下:


-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) 編譯這個模塊,之后就可以簡單的使用了.

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

復制代碼 代碼如下:


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

 

% 開啟無限循環
Pid = test:start().
% Waiting for new message.                             % 新進程 spawn 后立刻運行
% => <0.35.0>                                          % 返回新進程的進程號

% 向進程發送消息
Pid ! 'message'.
% New message: message                                 % 接收到消息
% Waiting for new message.                             % 繼續接收消息
% => message                                           % 語句返回值,而非進程返回消息


為了用戶不用每次都 Pid ! 'message',可以加入一個 call 方法進行包裝一下。

復制代碼 代碼如下:

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


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

 

但是這樣寫還有個明顯的弊端,調用 call 時需要 Pid 參數,但是又不能去掉,因為需要進程號才能通信,所以使用時需要用戶維護一個進程號。

而 Erlang 提供了注冊進程的機制用來把原子關聯到進程中,可以解決這個問題

使用 register(atom, Pid) 可以將 atom 關聯到進程號為 Pid 的進程上,這個原子就

修改上面的 start 函數為

復制代碼 代碼如下:

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


這樣,新的進程將關聯到原子 testp,此時原子就可以當作 Pid 那樣使用 "消息發送操作符" !

復制代碼 代碼如下:

testp ! 'message'


于是可以修改上面的 call 函數,去掉 Pid 參數,而使用關聯后的原子,這個關聯后的原子不止在模塊內有效,在全局作用域中都是有效的。

復制代碼 代碼如下:

call(M) ->
    testp ! M.


因此使用注冊進程修改后的程序如下

復制代碼 代碼如下:


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


注冊相關的 BIF

復制代碼 代碼如下:


% 注冊 atom 到 Pid

 

register(atom, Pid).

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

% 返回 atom 關聯的進程號,如果未關聯,返回 undefined
whereis(atom).

% 返回系統中所有已注冊的進程名
registered().

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91精品导航在线观看 | 亚洲高清中文字幕精品不卡 | chinese456老人gay| 成年人在线观看视频免费 | 国产a在线 | 国产欧美日韩视频在线观看一区二区 | 99久久精品无码一区二区毛片 | 操骚0| 亚洲欧美成人综合 | 波多野结衣52部合集在线观看 | 青草视频在线观看免费网站 | 日韩日韩日韩手机看片自拍 | 欧美精品一区二区三区久久 | s0e一923春菜花在线播放 | 成人福利视频网址 | 4438成人网 | 亚洲 欧美 在线观看 | 毛片网在线观看 | ass亚洲熟妇毛茸茸pics | 天天色影视综合网 | 精品日韩一区 | h版在线观看 | 亚洲国产成人99精品激情在线 | 日本精品一卡二卡≡卡四卡 | 无人区在线观看免费国语完整版 | 深夜激情网站 | 欧美一级欧美三级在线 | 国产农村乱子伦精品视频 | 小莹的性荡生活45章 | 射18p| 全黄一级裸片视频免费 | 亚洲国产精品日韩高清秒播 | 久久精品AV一区二区无码 | 百合漫画咱啪全彩抚慰 | 亚洲天堂视频在线免费观看 | 欧亚专线欧洲m码可遇不可求 | 504神宫寺奈绪大战黑人 | 肉车各种play文r | 国产麻豆91欧美一区二区 | 精品视频免费在线观看 | 好大好深好涨好烫还要 |