zoukankan      html  css  js  c++  java
  • 对于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上启动服务:
    (node1@dev-pc)> test:start(pid1, node()).
    yes
    (node1@dev-pc)> test:rpc_call(pid1, "msg - 1").
    "received your msg: msg - 1"
    在node2和node3上测试效果:
    (node3@dev-pc)> test:rpc_call(pid1, "msg - 3").
    "received your msg: msg - 3"
    
    (node2@dev-pc)> 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)调用.
    
    节点名的形式是: NodeName@Host, 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] 返回网络上与当前节点连接的所有其它节点列表
  • 相关阅读:
    react ts axios 配置跨域
    npm run eject“Remove untracked files, stash or commit any changes, and try again.”错误
    java 进程的参数和list的线程安全
    帆软报表 大屏列表跑马灯效果JS
    帆软报表 快速复用数据集,避免重复劳动
    分析云 OA中部门分级思路和实现方法
    分析云 分段器 只显示一个块的数据
    分析云 更改服务默认的端口号
    分析云U8项目配置方法新版本(2)
    Oracle 创建时间维度表并更新是否工作日字段
  • 原文地址:https://www.cnblogs.com/ziyouchutuwenwu/p/4068704.html
Copyright © 2011-2022 走看看