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