erlang中pg2模块使用

pg2这个模块实现了进程组的功能。这个模块之前有个模块为pg,pg模块的进行组中消息将被发送到组内的每个进程,但是pg2却不同,它可以选择性地将消息发送给单个、某些或全部组内成员。通过进程组的名称可以访问组内的进程,例如进程组的名称为foobar,而且有一系列进程位于组内,可能这些进程位于不同的节点上,都可以成为foobar的成员。不能够直接向foobar发送消息,但是通过方法get_members/1 和 get_local_members/1获取的组内的进程,然后可以与查出的进程通信。


下面是一些示例:

%%通常pg2服务器不需要明确显示的启动的,而是在需要的时候动态的启动,
%%例如你调用pg2:create是pg2服务已经启动,如果要显示的启动,调用
1> pg2:start().
{ok,<0.34.0>}

2> pg2:start_link().
{error,{already_started,<0.34.0>}}


%%创建名字为group1的进程组
3> pg2:create(group1).
ok


%%查看所有可见的组
pg2:which_groups().
4> pg2:which_groups().
[group1,group2]


%%同一个进程可以多次加入到组中,如果需要将一个进程加入到一个组中,如下
15> pg2:join(group1,self()).
ok
16> pg2:join(group1,self()).
ok
17> self().
<0.48.0>
18> pg2:get_members(group1).
[<0.48.0>,<0.48.0>]
19> pg2:leave(group1,self()).
ok
20> pg2:get_members(group1). 
[<0.48.0>]




%%获取本节点内位于组内的进程
21> pg2:get_local_members(group1).
[<0.48.0>]


%%从进程组中,随机获取一个进程
22> pg2:get_closest_pid(group1).
<0.48.0>


%%删除进程组
23> pg2:delete(g1).         
ok

 

测试:

总结:不同节点之间pg2不能共享,除非是在同一个集群中的节点之间才能实现pg2共享

 

测试继续:使用pg2:get_local_members获取本节点内位于组内的进程,开启两个节点,按图中数字顺序依次输入

1、打通两个节点(数字1)

2、a节点创建一个进程组group(数字4)

3、分别将两个节点的进程加入到group进程组

4、pg2:get_members(group)返回两个进程的列表,说明该方法返回group群组中的所有进程成员(数字10)

5、pg2:get_local_members(group)只返回是当前节点的进程,说明该方法只返回当前本地节点的进程,过滤到了其他节点的进程

疑问:为什么数字6执行的时候返回的是[],数字7再次执行的时候才返回当前所有的群组,求高手解答,非常感激

解答:因为每个节点的pg2模块默认都是关闭的,需要显示或者隐示的先启动一次,此处a节点执行pg2:create(gourp)的时候隐示的启动了pg2模块,而b节点没有启动,当b节点第一次执行pg2:which_groups()的时候才隐示的启动,启动后第二次执行才能获取对应的数据(感谢澍哥的解答)

本人新手一枚,以上纯属个人理解,如有理解错误的地方,麻烦务必指出纠正,谢谢...

 

 

posted @ 2016-08-20 02:15  Shay_黄  阅读(782)  评论(0编辑  收藏  举报