Erlang并发编程介绍

2019-11-06 09:25:41王冬梅

end

after之后的TimeOutExpr表达式返回一个整数time(毫秒级别),时间的精确程度依赖于Erlang在操作系统或者硬件的实现。如果在time毫秒内,没有一个消息被选中,超时设置将生效,也就是ActionT将执行。time有两个特殊值:

1)infinity(无穷大),infinity是一个atom,指定了超时设置将永远不会被执行。
2) 0,超时如果设定为0意味着超时设置将立刻执行,但是系统将首先尝试当前“邮箱”里的消息。

超时的常见几个应用,比如挂起当前进程多少毫秒:


sleep(Time) ->
  receive
    after Time ->
    true
end.

  比如清空进程的“邮箱”,丢弃“邮箱”里的所有消息:
   
flush_buffer() ->
  receive
    AnyMessage ->
      flush_buffer()
  after 0 ->
    true
end.

    将当前进程永远挂起:

  suspend() ->
    receive
    after
        infinity ->
            true
    end.

    超时也可以应用于实现定时器,比如下面这个例子,创建一个进程,这个进程将在设定时间后向自己发送消息:

-module(timer).
-export([timeout/2,cancel/1,timer/3]).
timeout(Time, Alarm) ->
   spawn(timer, timer, [self(),Time,Alarm]).
cancel(Timer) ->
   Timer ! {self(),cancel}.
timer(Pid, Time, Alarm) ->
   receive
    {Pid,cancel} ->
       true
   after Time ->
       Pid ! Alarm
end.

5、注册进程
    为了给进程发送消息,我们需要知道进程的Pid,但是在某些情况下:在一个很大系统里面有很多的全局servers,或者为了安全考虑需要隐藏进程Pid。为了达到可以发送消息给一个不知道Pid的进程的目的,我们提供了注册进程的办法,给进程们注册名字,这些名字必须是atom。
    基本的调用形式:

register(Name, Pid)

将Name与进程Pid联系起来

unregister(Name)

取消Name与相应进程的对应关系。

whereis(Name)

返回Name所关联的进程的Pid,如果没有进程与之关联,就返回atom:undefined

registered()

返回当前注册的进程的名字列表

6.进程的优先级