抄自
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 testcookieerl -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 取當前...