Erlang中带超时的receive

1.编程语言的每一个规则出现,肯定是为了能解决一部分问题,我们学习编程语言也应该是带着疑问去学习。

为什么会有带超时的receive,是因为:

   有时如果摸个message迟迟不来,receive就可能进入无限的等待之中。造成这种情况有几种原因。可能是某个程序内部逻辑有问题,或者,那个准备发送message的进程在发送Message之前挂掉了。

   所以,便有了这个带有超时的receive。这样就解决了上述问题。

2.那么,这个带有超时的receive是什么样子的

   如下:

   receive

      Pattern1 [when Guard1]->

        Expressions1;

    Pattern2 [when Guard2]->

      Expressions2;

      ...

   after Time ->

      Expressions

   end

   如果在进入receive的表达式后,在Time所规定的毫秒数内,未接收到能够匹配的消息,那么进程就会停止等待,并对Expressions进行求值。

3. 了解了以上两点后,我们就要系统了解这个receive超时的类型了

    分为一下几种:

  • 只有超时的receive

    你可以写出一个只有超时的receive语句,使用这个语句,我们可以定义一个sleep(T)函数,用它让当前进程暂停Tms

    sleep(T)->

        receive

      after T ->

        true

      end.

  • 超时时间为0的receive

  一个超时时间为0的语句会立即触发一个超时,但在此之前,系统会尝试对邮箱进行模式匹配。我们可以用这个特性来定义一个flush_buffer函数,它可以完全清空进程邮箱中的所有消息:

  flush_buffer()->

    receive

      _Any ->

        flush_buffer()

    after 0->

        true

    end.

       如果没有超时子句,在邮箱为空的情况下,flush_buffer会永久暂停,而不会返回,我们可以用0超时实现一个“优先接收”的程序:

      priority_receive()->  

    receive

      {alarm,X}->

    after 0->

                 receive

        Any->

          Any

      end

    end.

  • 使用一个无限等待超时进行接收

  如果receive语句的超时值被设定为原子infinity,那么系统就永远不会触发超时,在那种超时值,实际上是有receive以外的其他语句来决定的程序中。

posted @ 2013-08-29 18:11  绝圣弃智  阅读(1723)  评论(0编辑  收藏  举报