Erlang/OTP's global module

  Erlang/OTP's global 模块可用于以原子的形式为Erlang分布式系统中的进程命名,确保同一时刻分布式系统中的每个进程都有唯一的一个名字。

  现在来看看global模块在实际操作中的表现吧,我们在两个一开始并未连接的Erlang结点中注册同一个名字,然后再将这两个结点连接起来,这时,系统将监测到两个节点中有相同的名字,将注销一个节点中的名字注册。

 

  首先,在两个独立的节点上分别注册名字a(这两个节点分别以erl -sname one and erl -sname two启动), 在one节点进行以下操作,

Eshell V5.6.2  (abort with ^G)
(
one@cuiweican)1> global:register_name(a, self()).
yes
(one@cuiweican)2> global:whereis_name(a).
<0.37.0>

从以上可以看到名字注册成功了(register_name返回值为yes),当使用whereis_name进行查询时,正如我们所期望,该函数返回了self()的值,即进程Shell的Pid。

现在two结点上进行相同的操作。

Eshell V5.6.2  (abort with ^G)
(two@cuiweican)1> global:register_name(a, self()).
yes
(two@cuiweican)2> global:whereis_name(a).
<0.37.0>

同样,名字注册成功了。注意到这两个节点都成功注册了全局名字 a,这是因为这两个节点之间并未有连接。一旦这两节点连接,Erlang/OTP 将自动解决这种冲突,默认情况下,将会注销其中的一个名字注册。

   现在来看看当两个节点连接时,会发生什么吧。我们通过从节点one向节点two ping使两个节点为连接起来。

(one@cuiweican)3> net_adm:ping(two@cuiweican).
pong
(one@cuiweican)4>
=INFO REPORT==== 13-Feb-2009::03:05:22 ===
global: Name conflict terminating {a,<5744.37.0>}

(one@cuiweican)4> global:whereis_name(a).
<0.37.0>
(one@cuiweican)5>

从其中一个节点输出的报告信息来看,其中节点two的名字被注销了。在节点two进行查询名字a时,会发现名字a在节点one中注册。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值