Erlang分布式节点中的注册进程使用实例_Erlang

上一篇文章中说到, 注册进程关联的原子具有全局作用域, 这里的全局指的是当前 Erlang 虚拟机, 在分布式中, 便是当前分布式节点. 因此, 在一个节点中注册进程关联的原子, 在另一个节点中是不能直接使用, 而必须配和目标节点使用.

复制代码 代码如下:

{RegName, Node} ! {messages}.

例子

先启动一个 Server 节点

复制代码 代码如下:

erl -sname server

然后在 Erlang Shell 中操作

先简单介绍几个常用函数

复制代码 代码如下:

% 查看当前节点
node().
% => 'server@Gentoo-PC'

% 查看所有已连接的节点
nodes().
% => []                                        % 此时还未连接其它节点

% 查看当前节点是否存活
is_alive().
% => true

然后进入正题

复制代码 代码如下:

% 启动上一篇文章中最后的那个程序
test:start().
% Waiting for new message.
% => true

% 当前节点可以使用 testp 原子
testp ! message.
% New message: message
% Waiting for new message.
% => message

然后启动另外一个 Client 节点

复制代码 代码如下:

erl -sname client

在新的 Erlang Shell 中

复制代码 代码如下:

nodes().
% => []                                         % 此时未连接节点

% 当前节点无法直接使用这个原子的
testp ! {}.
% ** exception error: bad argument
%      in operator  !/2
%         called as testp ! {}

% 需要配合目标节点一起使用
{testp, 'server@Gentoo-PC'} ! {}.
% => {}                                         % 语句返回值

此时, server 节点就会接收到消息, 并打印出

复制代码 代码如下:

% New message: {}
% Waiting for new message.

节点间首次连接后, 两个节点将会保持连接

在 Client 节点中

复制代码 代码如下:

nodes().
% => ['server@Gentoo-PC']

在 Server 节点中

复制代码 代码如下:

nodes().
% => ['client@Gentoo-PC']

结尾

当然, 这只是个方法, 由于在模块中定义了 call 函数包裹了起来, 所以可以使用远程调用, 调用 Server 节点上的 test:call 方法.

可以使用 rpc 模块中的 call/4 方法远程调用函数

复制代码 代码如下:

% 在 Node 节点上执行 apply(Module, Function, Args)
% 调用成功时返回 Result, 调用失败时返回 {badrpc, Reason}
-spec rpc:call(Node, Module, Function, Args} -> Result | {badrpc, Reason}

在 Client 节点中

复制代码 代码如下:

rpc:call('server@Gentoo-PC', test, call, ['message from other node']).

时间: 2024-10-31 12:50:24

Erlang分布式节点中的注册进程使用实例_Erlang的相关文章

Erlang中的注册进程使用实例_Erlang

之前看到 Erlang 中的注册进程时,对注册并不理解,主要是不理解注册的原子的作用域.刚才突然想明白了: 复制代码 代码如下: 注册进程关联的原子具有全局作用域 也就是说关联了注册进程之后的原子可以全局被使用 Erlang 中的并发机制是通过消息邮箱实现的,进程间进行通讯的方式只有消息邮箱,而进程间通讯需要知道进程的进程号,而使用 spawn 产生新进程时会返回新进程的进程号供使用. 一个最简单的进程间通信的程序如下 复制代码 代码如下: -module(test). start() ->  

分布式服务框架 Zookeeper -- 管理分布式环境中的数据

安装和配置详解 本文介绍的 Zookeeper 是以 3.2.2 这个稳定版本为基础,最新的版本可以通过官网 http://hadoop.apache.org/zookeeper/来获取,Zookeeper 的安装非常简单,下面将从单机模式和集群模式两个方面介绍 Zookeeper 的安装和配置. 单机模式 单机安装非常简单,只要获取到 Zookeeper 的压缩包并解压到某个目录如:/home/zookeeper-3.2.2 下,Zookeeper 的启动脚本在 bin 目录下,Linux 下

Erlang分布式在linux和windows上的注意事项

  没事做,就在两台机器间测试下Erlang分布式的例子,一个台是windowsXP,一台装的redHat9,没有详细的文档,自己摸索着搞成功了,记录下. 1.首先,分布式Erlang的实现提供了自有的安全机制来预防未经授权的Erlang系统访问.Erlang系统与别的机器进行交互时必须有同样的magic cookie,保存在一个称为.erlang.cookie的文件中,为了在两台不同机器间测试,需要编辑一份.erlang.cookie,内容随便,比如: just_test 然后将这份文件拷贝到

Linux中线程和进程的区别

Linux中线程和进程的区别 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,它是系统进行资源分配和调度的一个独立单位.例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格.内存空间.磁盘空间.I/O设备等,然后该进程被放入到进程的就绪队列,进程调度程序选中它,为它分配CPU及其他相关资源,该进程就被运行起来. 线程是进程的一个实体,是CPU调度和分配的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器.一组寄存器和栈),但

[EnterpriseServices]利用assembly定义我们的组件在COM+中的注册方式

enterprise|services 整理者 郑昀@UltraPower 利用以下assembly定义我们的组件在COM+中的注册方式,其中: ApplicationName 属性是"COM+ 目录"和"组件服务管理"控制台中显示的 COM+ 应用程序的名称. [assembly: ApplicationName("MyDLL.Interface")] Description属性为"COM+ 目录"和"组件服务管理

Win7系统启动项中没有“ctfmon”进程无法正常使用输入法怎么办

  Win7系统启动项中没有"ctfmon"进程无法正常使用输入法怎么办          具体步骤: 1.按下"Win+R"组合键打开运行,在运行框中输入:regedit 点击确定打开注册表编辑器; 2.在左侧依次展开:HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun; 3.在右侧单击右键,依次选择"新建-"字符串值",将其命名为:ctfmon.exe; 4.双击打开

一致性哈希在分布式数据库中的应用探索

本文大部分内容参考自http://blog.csdn.net/cywosp/article/details/23397179 背景 在分布式数据库中,设计数据分布算法通常需要考虑到几点 平衡性(Balance)平衡性是指哈希的结果能够尽可能分布到所有的分片节点中去,这样可以使得所有的分片节点都得到利用. 很多哈希算法都能够满足这一条件. 单调性(Monotonicity)单调性是指如果已经有一些内容通过哈希分派到了相应的分片节点中,又有新的分片节点加入到系统中. 哈希的结果应能够保证原有已分配的

无法读取此系统上以前注册的服务器的列表。请在“已注册的服务器”窗口中重新注册您的服务器

环境: 服务器系统: 数据库版本:Microsoft SQL Server 2008 R2 错误提示如下图: 截图来自:点击打开链接 详细错误信息: 有关调用实时(JIT)调试而不是此对话框的详细信息, 请参见此消息的结尾. ************** 异常文本 ************** Microsoft.SqlServer.Management.RegisteredServers.RegisteredServerException: 无法读取此系统上以前注册的服务器的列表.请在"已注册

mfc-MFC中设置注册界面,运行结果一直是注册成功,怎么回事?求大神指点

问题描述 MFC中设置注册界面,运行结果一直是注册成功,怎么回事?求大神指点 void CREGISTERDlg::OnBnClickedButtonOk(){ // TODO: 在此添加控件通知处理程序代码 UpdateData(true); if (m_NAME == "" "" || m_PWD == "" "" || m_PWD1 == "" "") { MessageBox(T