在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 區(qū)塊鏈/ 注冊進程名稱
注冊進程名稱
錯誤處理
完整示例
分布式編程
消息傳遞
if 與 case
健壯性
映射 (Map)
高階函數(shù) (Fun)
輸出至終端
更多關于列表的內容
內置函數(shù) (BIF)
模塊與函數(shù)
將大程序分在多個文件中
匹配、Guards 與變量的作用域
超時
列表
完整示例
頭文件
標準模塊與使用手冊
進程
記錄
增加健壯性后的完整示例
Erlang Shell
原子類型

注冊進程名稱

上面的例子中,因為 “Pong” 在 “ping” 進程開始前已經創(chuàng)建完成,所以才能將 “pong” 進程的進程標識符作為參數(shù)傳遞給進程 “ping”。這也就說,“ping” 進程必須通過某種途徑獲得 “pong” 進程的進程標識符后才能將消息發(fā)送 “pong” 進程。然而,某些情況下,進程需要相互獨立地啟動,而這些進程之間又要求知道彼此的進程標識符,前面提到的這種方式就不能滿足要求了。因此,Erlang 提供了為每個進程提供一個名稱綁定的機制,這樣進程間通信就可以通過進程名來實現(xiàn),而不需要知道進程的進程標識符了。為每個進程注冊一個名稱需要用到內置函數(shù) register:

register(some_atom, Pid)

接下來,讓我們一起上面的 ping pong 示例程序。這一次,我們?yōu)?“pong” 進程賦予了一名進程名稱 pong:

-module(tut16).

-export([start/0, ping/1, pong/0]).

ping(0) ->
    pong ! finished,
    io:format("ping finished~n", []);

ping(N) ->
    pong ! {ping, self()},
    receive
        pong ->
            io:format("Ping received pong~n", [])
    end,
    ping(N - 1).

pong() ->
    receive
        finished ->
            io:format("Pong finished~n", []);
        {ping, Ping_PID} ->
            io:format("Pong received ping~n", []),
            Ping_PID ! pong,
            pong()
    end.

start() ->
    register(pong, spawn(tut16, pong, [])),
    spawn(tut16, ping, [3]).
2> c(tut16).
{ok, tut16}
3> tut16:start().
<0.38.0>
Pong received ping
Ping received pong
Pong received ping
Ping received pong
Pong received ping
Ping received pong
ping finished
Pong finished

start/0 函數(shù)如下:

register(pong, spawn(tut16, pong, [])),

創(chuàng)建 “pong” 進程的同時還賦予了它一個名稱 pong。在 “ping” 進程中,通過如下的形式發(fā)送消息:

pong ! {ping, self()},

ping/2 變成了 ping/1。這是因為不再需要參數(shù) Pong_PID 了。

上一篇:進程下一篇:超時