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再次执行的时候才返回当前所有的群组,求高手解答,非常感激

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

 

时间: 2024-11-03 23:00:05

erlang中pg2模块使用的相关文章

Erlang中的模块与模式匹配

模块是Erlang的基本代码单元,erl文件编译后以.beam作为扩展名,采用UTF8字符集,.erl文件示意如下: -module(模块名,与存放模块的文件名相同) -export([方法名/输入参数的个数]) Method1( {a,b,c})->a*b*c; Mehtod2({d,e})->d-e. 模块属性有两种类型:预定义型和用户定义型. Erlang中用于代表函数的数据类型被称为fun,相当于python中的lambda,一般用于 1)      对列表里的每个元素执行相同的操作

erlang中字符编码转换(转)

转自:http://www.thinksaas.cn/group/topic/244329/ 功能说明: erlang中对各种语言的编码支持不足,此代码是使用erlang驱动了著名的iconv编码库来对字符进行编码转换处理. 文件说明: iconv_erl.c和iconv.h 是erlang字符编码模块的driver,作用是对iconv进行封装.编译后生成iconv_erl.dll,供iconv.erl使用. iconv_makefile.win32 windows上编译iconv_erl.dl

Erlang中的record与宏

http://www.cnblogs.com/me-sa/archive/2011/07/20/erlang0006.html 在Erlang中使用Tuple ,数据项的顺序\数量都是确定的,一旦数据项顺序调整或者增减字段,都容易出现badmatch. 同时一些常量如果硬编码到代码中,一旦数值变化,要想全部可靠的替换成新的数值是一个困难的事情. 这两种数据层面的变化,在Erlang中对应的解决方案是: record  Macro record   在代码中我们创建一个record:   -rec

Erlang中的基本元素操作

Erlang shell中,用句号加空格.tab或回车来结束表达式,%表示注释的起点,;隔离子句.模块是.erl 文件,库的头文件.hrl, shell中的编译时c(),外编译命令时erlc, 退出shell用q(),或erlang:halt(). 变量以大写字母开头,且不能重新绑定变量,只能一次性赋值,具有不可变状态. 原子是全局的,不需要宏定义或包含文件,以小写字母开头,还可放在单引号内,是极简表达式. 元组tuple是一些数量固定的项目归组成单一实体{,}, 由于是匿名的,通常在第一个元素

Node.js中的模块机制

本文为读书笔记. 一.CommonJS的模块规范 Node与浏览器以及 W3C组织.CommonJS组织.ECMAScript之间的关系 Node借鉴CommonJS的Modules规范实现了一套模块系统,所以先来看看CommonJS的模块规范. CommonJS对模块的定义十分简单,主要分为模块引用.模块定义和模块标识3个部分. 1. 模块引用 模块引用的示例代码如下: var math = require('math'); 在CommonJS规范中,存在require()方法,这个方法接受模

Python中time模块详解

在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. 在开始之前,首先要说明这几点: 在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素.由于Python的time模块实现主要调用C库,所以各个平台可能有所不同. UTC(Coordinated Universal Time,世界协调时)亦即格林威治天文时间,世界标准时间.在中国为UTC+8.DST

Yii2中的模块、应用程序(Module,Application)

原文地址:http://www.kuitao8.com/20140626/2715.shtml 模块(Module ) 模块是一个功能独立的逻辑单元,每一个模块都可以包含有多个子模块,但每个模块只能有一个对应的父模块(如果有的话).它的定义在yii\base\Module 应用程序(Application) Yii2中的应用程序有两种:web应用程序(yii\web\Application)和控制台应用程序(yii\console\Application).他们都继承于yii\base\Appl

Python中ConfigParser模块应用

Python中ConfigParser模块应用 Python的ConfigParser模块定义了3个对INI文件进行操作的类 RawConfigParser,ConfigParser和SafeConfigParser.其中RawCnfigParser是最基础的INI文件读取类,ConfigParser.SafeConfigParser支持对%(value)s变量的解析. 下面看看怎样通过ConfigParser类来解析一个ini文件. 配置文件settings.cfg [DEFAULT] myk

python中的模块安装

python中的模块研究: 需要用import导入的模块都是用python实现的. 内建的部分是用c.c++实现的. pypi:第三方的python包. 在windows上安装python: 1.安装python到C:\PythonXX,添加系统环境变量path:C:\PythonXX. 安装pypi库的方法三种方法: 1.在pypi上下载安装包离线安装 cd  $package-dir python   setup.py  install 在windos的cmd上也可以这样安装. 3.用eas