名字服务
功能:向服务器提交一个名字,然后服务器返回一个与这个名字关联的值。
Read more...
-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,...,).