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再次执行的时候才返回当前所有的群组,求高手解答,非常感激
本人新手一枚,以上纯属个人理解,如有理解错误的地方,麻烦务必指出纠正,谢谢...