對於global的介紹

2021-09-06 19:14:37 字數 3015 閱讀 4773

抄自

1. 介紹:

這個全域性服務是通過乙個global_name_server的process來提供的,這個程序存在於每乙個erlang node, 這個全域性名字

服務在每個節點啟動的時候自動啟動.

這個模組在所有的鏈結的erlang節點的集群中實現了register_name/2和whereis_name/1的功能.乙個註冊名是乙個pid的別名,

這個名字服務程序管理這些註冊的pid,如果乙個process終止,名字將自動被登出unregistered.

這些註冊名儲存在name table中,這個name table在每乙個節點上都存在,因此名字服務的呼叫是快速的,當乙個操作改變了

name table, 所有的節點的name table都會自動被更新.

2. 單個節點的例子:

-module(test).

-export([start/1, rpc_call/2, handle_msg/1

]).start(name) ->pid = spawn(?module, handle_msg, [name]),

register(name, pid). %%在本地node註冊process的名字

rpc_call(name, msg) ->name ! , %%向本地node的process發訊息

receive

->reply

end.

handle_msg(name) ->receive

->pid !;

->pid ! ,

handle_msg(name)

end.

測試:

測試:

測試: 

啟動乙個本地的process, 並註冊乙個名字pid1, 呼叫whereis/1測試,返回pid,

測試通過名字pid1對程序發訊息,

之後停止process, 再次呼叫whereis/1測試,返回undefined

test:start(pid1).               

true

whereis(pid1).

<0.64.0>test:rpc_call(pid1,

"test - 1").

"received your msg: test - 1

"test:rpc_call(pid1,

"test - 2").

"received your msg: test - 2

"test:rpc_call(pid1, stop).

stop

whereis(pid1).

undefined

3. erlang nodes集群的例子:

-module(test).

-export([start/2, rpc_call/2, handle_msg/1

]).start(name, node) ->pid = spawn(node, ?module, handle_msg, [name]),

global:register_name(name, pid). %%註冊global的process的名字

rpc_call(name, msg) ->

global:send(name, ), %%向global的name訊息傳送方式

receive

->reply

end.

handle_msg(name) ->receive

->pid !;

->pid ! ,

handle_msg(name)

end.

測試:在同一臺機器上啟動三個節點的erlang集群:

erl -sname node1 -setcookie testcookie

erl -sname node2 -setcookie testcookie

erl -sname node3 -setcookie testcookie

在node1上啟動服務:

(node1@dev-pc)>test:start(pid1, node()).

yes(node1@dev-pc)> test:rpc_call(pid1, "

msg - 1").

"received your msg: msg - 1

"在node2和node3上測試效果:

(node3@dev-pc)> test:rpc_call(pid1, "

msg - 3").

"received your msg: msg - 3

"(node2@dev-pc)> test:rpc_call(pid1, "

msg - 2").

"received your msg: msg - 2

"

4. 分布式的知識補充:

<1> 如何在呼叫遠端node上的方法?rpc:call(node, mod, func, [arg1, ... argn]).

會在node上進行一次mod:func(arg1, ... argn)呼叫.

節點名的形式是: nodename@host, nodename和host都是atom(), 其實整個節點名就是乙個atom().

<2> 在不需要dns的情況下使用erl -sname node1,

需要dns的情況下使用erl -name node2

<3>設定cookie:

erl -setcookie testcookie

或者erlang:set_cookie(node, testcookie)

<4> 如何保持兩個node上的**版本一致?可以使用nl(mod), 這個操作會使所有互聯的節點上載入mod.

<5>判斷節點的連通性: net_adm:ping(node)

<6> node() ->node 返回本地節點的名字

nodes() -> [node] 返回網路上與當前節點連線的所有其它節點列表

對於global的介紹

抄自 1.介紹 這個全域性服務是通過乙個global name server的process來提供的,這個程序存在於每乙個erlang node,這個全域性名字 服務在每個節點啟動的時候自動啟動.這個模組在所有的鏈結的erlang節點的集群中實現了register name 2和whereis na...

php中global與 GLOBAL的用法及區別

php中global 與 globals 差別 原本覺得global和 globals除了寫法不一樣覺得,其他都一樣,可是在實際利用中發現2者的差別還是很大的 先看下面的例子 php 例子1 function test global function test globals var1 5 var2...

C 中對於DateTime的介紹

1.0 datetime 數字型 system.datetime currenttime new system.datetime 1.1 取當前年月日時分秒 currenttime system.datetime.now 1.2 取當前年 int 年 currenttime.year 1.3 取當前...