名字服务 功能:向服务器提交一个名字,然后服务器返回一个与这个名字关联的值。
-module(kvs).
-export([start/0,store/2,lookup/1]).

start() -> register(kvs,spawn(fun() -> loop() end)).
store(Key,Value) -> rpc({store,Key,Value}).
lookup(Key) -> rpc({lookup,Key}).

rpc(Q) ->
    kvs ! {self(),Q},
    receive
        {kvs,Reply} ->
            Reply
    end.
loop() ->
    receive
        {From,{store,Key,Value}} ->
            put(Key,{ok,Value}),
            From ! {kvs,true},
            loop();
        {From,{lookup,Key}} ->
            From ! {kvs,get(Key)},
            loop()
    end.
4> c(kvs.erl). {ok,kvs} 5> kvs:start(). true 6> kvs:store({location,joe},"Stockholm"). true 7> kvs:store(weather,raining). true 8> kvs:lookup(weather). {ok,raining} 10> kvs:lookup({location,joe}). {ok,"Stockholm"} 11> kvs:lookup({location,jane}). undefined 执行kvs:start(),将创建服务器进程,将接受消息并操作。匹配{From,{store,Key,Value}} 用于接收需要存储的键和值,存储后,给客户端发送保存成功的消息。 {From,{lookup,Key}}取得Key对应的值,并返回该值。 执行6句,将向服务进程发送key和value,第八句则是取值。 同一台机器上,客户端运行一个节点而服务端运行一个节点 需要打开两个终端。 启动一个名为s的erlang节点。并启动服务 D:\erlang5.9.1\code>erl -sname s@localhost (s@localhost)1> kvs:start(). true 启动名为a的erlang节点,然后使用erlang标准库模块prc来调用kvs模块中的函数。 D:\erlang5.9.1\code>erl -sname a@localhost (a@localhost)1> rpc:call(s@localhost,kvs,store,[weather,fine]). =PROGRESS REPORT==== 10-Aug-2012::11:53:03 === supervisor: {local,inet_gethost_native_sup} started: [{pid,<0.49.0>},{mfa,{inet_gethost_native,init,[[]]}}] =PROGRESS REPORT==== 10-Aug-2012::11:53:03 === supervisor: {local,kernel_safe_sup} started: [{pid,<0.48.0>}, {name,inet_gethost_native_sup}, {mfargs,{inet_gethost_native,start_link,[]}}, {restart_type,temporary}, {shutdown,1000}, {child_type,worker}] true (a@localhost)2> rpc:call(s@localhost,kvs,lookup,[weather]). {ok,fine} 在a节点验证weather的值 (s@localhost)2> kvs:lookup(weather). {ok,fine} 函数rpc:call(Node,Mod,Func,[Arg1,Arg2,...,])在Node上执行一个远程调用。被调用的函数是Mod:Func(Arg1,Arg2,...,).

上一篇:
下一篇:

相关文章:

Categories: 博客记录

0 Responses so far.

Leave a Reply