[每日一Errr~lang] process basic
2010-02-28 00:19:04| 分类:
lang_erlang
| 标签:
|举报
|字号大中小 订阅
大家好,欢迎收看KKTV的《每日一Errr~lang》节目,今天我们来看看 erlang 中关于 process 的一些基础知识。
创建 process / 消息通讯
弄个简单的程序,然后通过 spawn(mod, name, args) 来创建一个 process。
-------------------------------------------------------
-module(myworker).
-export([loop/0]).
loop() ->
receive
{foo, Val} ->
io:format("foo = ~p~n", [Val]);
{bar, Val} ->
io:format("bar = ~p~n", [Val])
end,
loop().
-------------------------------------------------------
1> c(myworker).
{ok,myworker}
2> Pid = spawn(myworker, loop, []).
<0.38.0>
3> Pid ! {foo, "hello"}.
foo = "hello"
{foo,"hello"}
4> Pid ! {bar, a_atom}.
bar = a_atom
{bar,a_atom}
5> Pid ! {no_this}.
{no_this}
-------------------------------------------------------
给一个 process 发消息非常简单吧,呵呵。还可以 Pid1 ! Pid2 ! ... ! Msg 同时给多个 process 发消息。
消息的处理顺序
对于一个 process,当 receive 时,相当于 block 住,直到有满足条件的消息到达时,才会唤醒 process。
-------------------------------------------------------
-module(message).
-export([loop/0]).
loop2() ->
receive
{bar, Val} ->
io:format("bar = ~p~n", [Val])
end,
loop().
loop() ->
receive
{foo, Val} ->
io:format("foo = ~p~n", [Val])
end,
loop2().
-------------------------------------------------------
1> c(message).
{ok,message}
2> Pid = spawn(fun message:loop/0).
<0.38.0>
3> Pid ! {bar, "hello"}.
{bar,"hello"}
4> Pid ! {foo, "cool"}.
foo = "cool"
{foo,"cool"}
bar = "hello"
-------------------------------------------------------
消息返回值
我们给一个 process 发消息,相当于调用 process 的一个函数,我们希望有个函数返回值,怎么做呢?
-------------------------------------------------------
-module(myserver).
-export([rpc/2, loop/0]).
rpc(Pid, Request) ->
Pid ! {self(), Request},
receive
{Pid, Response} -> % 这里 Pid 保证了返回值来自于期望的 process
Response
end.
loop() ->
receive
{From, {add, A, B}} ->
From ! {self(), A+B},
loop();
{From, {sub, A, B}} ->
From ! {self(), A-B},
loop();
{From, Other} ->
From ! {self(), {error, Other}},
loop()
end.
-------------------------------------------------------
1> c(myserver).
{ok,myserver}
2> Pid = spawn(fun myserver:loop/0).
<0.38.0>
3> myserver:rpc(Pid, {add, 2, 1}).
3
4> myserver:rpc(Pid, {sub, 2, 1}).
1
5> myserver:rpc(Pid, {no_such, 2, 1}).
{error,{no_such,2,1}}
-------------------------------------------------------
消息的 timeout
某些 process,希望5秒内接受某消息,5秒过去还未收到,则做一些别的处理。
-------------------------------------------------------
-module(mytimeout).
-export([loop/0]).
loop() ->
receive
{foo, Val} ->
io:format("foo = ~p~n", [Val]);
{bar, Val} ->
io:format("bar = ~p~n", [Val])
after
timer:seconds(5) ->
io:format("timeout~n")
end,
loop().
-------------------------------------------------------
1> c(mytimeout).
{ok,mytimeout}
2> Pid = spawn(fun mytimeout:loop/0).
<0.38.0>
3> Pid ! {foo, "hello"}.
foo = "hello"
{foo,"hello"}
timeout
timeout
-------------------------------------------------------
Registered Process
对于常用功能的 process,使用 Pid 实在不方便,我们可以把 Pid 与一个 atom 关联,这样调用起来就方便了。
-------------------------------------------------------
1> c(myworker).
{ok,myworker}
2> Pid = spawn(fun myworker:loop/0).
<0.38.0>
3> register(coolworker, Pid).
true
4> coolworker!{foo, "hello"}.
foo = "hello"
{foo,"hello"}
5> whereis(coolworker).
<0.38.0>
6> registered().
<0.38.0>
7> registered().
[code_server,user_drv,error_logger,rex,standard_error,
standard_error_sup,erl_prim_loader,application_controller,
kernel_sup,init,global_name_server,kernel_safe_sup,
coolworker,global_group,file_server_2,inet_db,user]
8> unregister(coolworker).
true
9> whereis(coolworker).
undefined
-------------------------------------------------------
时间飞逝,今天的内容讲解完毕,大家懂了么?如有疑问,可以拨打我们的免费电话 000-5412226,我们将竭诚为您解答。
评论这张
转发至微博
转发至微博
评论