【转】重点介绍erlang的global模块

转自:http://veniceweb.googlecode.com/svn/trunk/public/daily_tech_doc/erlang_global_20091109.txt

1. 介绍:
这个全局服务是通过一个global_name_server的process来提供的,这个进程存在于每一个erlang node, 这个全局名字
服务在每个节点启动的时候自动启动.

这个模块在所有的链接的erlang节点的集群中实现了register_name/2和whereis_name/1的功能.一个注册名是一个pid的别名,
这个名字服务进程管理这些注册的pid,如果一个process终止,名字将自动被注销unregistered.

这些注册名储存在name table中,这个name table在每一个节点上都存在,因此名字服务的调用是快速的,当一个操作改变了
name table, 所有的节点的name table都会自动被更新. 

2. 单个节点的例子:
-module(test).
-export([start/1, rpc_call/2, handle_msg/1]).

start(Name) ->
    Pid = spawn(?MODULE, handle_msg, [Name]),
    register(Name, Pid).          %% 在本地node注册process的名字

rpc_call(Name, Msg) ->
    Name ! {Msg, self()},         %% 向本地node的process发消息
    receive
	{Reply, Name} ->
	    Reply
    end.

handle_msg(Name) ->
    receive
	{stop, Pid} ->
	    Pid ! {stop, Name};
	{Msg, Pid} ->
	    Pid ! {"received your msg: " ++ Msg, Name},
	    handle_msg(Name)
    end.

测试:
启动一个本地的process, 并注册一个名字pid1, 调用whereis/1测试,返回Pid,
测试通过名字pid1对进程发消息,
之后停止process, 再次调用whereis/1测试,返回undefined
test:start(pid1).
true
whereis(pid1).
<0.64.0>
test:rpc_call(pid1, "test - 1").
"received your msg: test - 1"
test:rpc_call(pid1, "test - 2").
"received your msg: test - 2"
test:rpc_call(pid1, stop).
stop
whereis(pid1).
undefined

3. Erlang Nodes集群的例子:
-module(test).
-export([start/2, rpc_call/2, handle_msg/1]).

start(Name, Node) ->
    Pid = spawn(Node, ?MODULE, handle_msg, [Name]),
    global:register_name(Name, Pid).    %% 注册global的process的名字

rpc_call(Name, Msg) ->
    global:send(Name, {Msg, self()}),   %% 向global的name消息发送方式
    receive
	{Reply, Name} ->
	    Reply
    end.

handle_msg(Name) ->
    receive
	{stop, Pid} ->
	    Pid ! {stop, Name};
	{Msg, Pid} ->
	    Pid ! {"received your msg: " ++ Msg, Name},
	    handle_msg(Name)
    end.

测试:
在同一台机器上启动三个节点的erlang集群:
erl -sname node1 -setcookie testcookie
erl -sname node2 -setcookie testcookie
erl -sname node3 -setcookie testcookie
在node1上启动服务:
([email protected])> test:start(pid1, node()).
yes
([email protected])> test:rpc_call(pid1, "msg - 1").
"received your msg: msg - 1"
在node2和node3上测试效果:
([email protected])> test:rpc_call(pid1, "msg - 3").
"received your msg: msg - 3"

([email protected])> test:rpc_call(pid1, "msg - 2").
"received your msg: msg - 2"

4. 分布式的知识补充:
<1> 如何在调用远程node上的方法?
rpc:call(Node, Mod, Func, [Arg1, ... ArgN]).
会在Node上进行一次Mod:Func(Arg1, ... ArgN)调用.

节点名的形式是: [email protected], NodeName和Host都是atom(), 其实整个节点名就是一个atom().

<2> 在不需要DNS的情况下使用erl -sname node1,
     需要DNS的情况下使用erl -name node2

<3> 设置cookie:
    erl -setcookie testcookie
    或者erlang:set_cookie(Node, testcookie)

<4> 如何保持两个node上的代码版本一致?
    可以使用nl(Mod), 这个操作会使所有互联的节点上加载Mod.

<5> 判断节点的连通性: net_adm:ping(Node)

<6> node() -> Node 返回本地节点的名字
    nodes() -> [Node] 返回网络上与当前节点连接的所有其它节点列表
时间: 2024-10-30 00:53:52

【转】重点介绍erlang的global模块的相关文章

Erlang基础 -- 介绍 -- Erlang特点

前言 Erlang是具有多重范型的编程语言,具有很多特点,主要的特点有以下几个: 函数式 并发性 分布式 健壮性 软实时 热更新 递增式代码加载 动态类型 解释型 函数式 Erlang是函数式编程语言,函数式是一种编程模型,将计算机中的运算看做是数学中的函数计算,可以避免状态以及变量的概念. 对象是面向对象的第一型,函数式编程语言也是一样,函数是函数式编程的第一型.函数是Erlang编程语言的基本单位,在Erlang里,函数是第一型,函数几乎会被用作一切,包括最简单的计算.所有的概念都是由函数表

erlang下lists模块sort(排序)方法源码解析(二)

上接erlang下lists模块sort(排序)方法源码解析(一),到目前为止,list列表已经被分割成N个列表,而且每个列表的元素是有序的(从大到小) 下面我们重点来看看mergel和rmergel模块,因为我们先前主要分析的split_1_*对应的是rmergel,我们先从rmergel查看,如下 ....................................................... split_1(X, Y, [], R, Rs) -> rmergel([[Y, X

Python学习笔记-模块介绍(二)-模块导入和执行

之前的一篇博文介绍了python中模块的概念和基本使用方法,模块作为python语言中的基本单元,可以用来编写公用库函数或对象以便重复使用.同时模块还可以作为独立文件进行运行,之前也已经提到,只要是导入了模块文件,那么PVM就会依次执行模块文件中的所有语句.本篇主要介绍模块使用的一些进阶,首先定义一个模块module_2.py,内容如下: # -*- encoding:utf-8 -*-'''module_2.py模块的内容''' print(__name__) def sum(a,b):ret

消息队列介绍、RabbitMQ&amp;Redis的重点介绍与简单应用

消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下消息队列的基本思路. 还记得原来写过Queue的文章,不管是线程queue还是进程queue他都是一种消息队列.他都是基于生产者消费者模型来处理消息. Python中的进程queue,是用于父进程与子进程,或者同属于一个父进程下的多个子进程之间进行信息交互.注意这种queue只能在同一个python程序下才能用,如果两个python程序,或者Python和别的什么程序,

[erlang]cowboy handler模块的使用

关于Cowboy Cowboy是基于Erlang实现的一个轻量级.快速.模块化的http web服务器. Handlers,用于处理HTTP请求的程序处理模块. Plain HTTP Handlers(常规Handlers) Cowboy里面的handler最基础的事情就是实现 init/2 回调函数,处理请求,发送客户端响应(可选),最后返回. Cowboy根据 router configuration (路由配置)接收请求并初始化State. 下面是一个不做任何处理的handler: ini

Python学习笔记-模块介绍(三)-模块包和搜索路径

一个python文件就是一个模块,使用独立的命名空间,但实际使用过程中单单用模块来定义python功能显然还不够.因为一个大型的系统几千上万个模块是很正常的事情,如果都聚集在一起显然不好管理并且有命名冲突的可能,因此python中也出现了一个包的概念. 一.python中的包介绍 包是通过使用"点模块名称"创建Python模块命名空间的一种方法.列如,模块名称 A.B 表示一个在名为 A的包下的名为B的子模块.就像使用模块让不同模块的作者无需担心彼此全局变量名称(冲突)一样,点模块名称

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)      对列表里的每个元素执行相同的操作

构建之法之个人技术和流程重点介绍

  2.1 单元测试 软件是由多人合作完成的,不同人员的工作相互有依赖关系.例如,一个人写的模块被其他人写得模块调用.软件的很多错误都来源于程序员对模块功能的误解.疏忽或不了解模块的变化.如何能让自己负责的模块功能定义尽量明确,模块内部的改变不会影响其他模块,而且模块的质量能得到稳定的.量化的保证?单元测试就是一个很有效的解决方法. 2.1.2 好的单元测试的标准 单元测试应该在最基本的功能/参数上验证程序的正确性. 单元测试必须由最熟悉代码的人(程序的作者)来写. 单元测试过后,机器状态保持不

网络爬虫研发重点介绍

一.网络爬虫的一般作法 1.1 基于Socket通信编写爬虫1.2 基于HttpURLConnection类编写爬虫1.3 基于apache的HttpClient包编写爬虫1.4 基于phantomjs之类的无头(无界面)浏览器1.5 基于Selenium之类的有头(有界面)浏览器 二.系统设计 2.1 模块划分:任务管理的UI交互层.任务调度层.网络爬取层.数据解析层.数据持久化层 2.2 项目划分数据采集/下载项目(download)数据解析项目(parser)数据持久化(persisten