注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[每日一Errr~lang] process basic  

2010-02-28 00:19:04|  分类: lang_erlang |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
大家好,欢迎收看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,我们将竭诚为您解答。
  评论这张
 
阅读(713)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017