Erlang中带超时的receive

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

为何会有带超时的receive,是由于:编程语言

   有时若是摸个message迟迟不来,receive就可能进入无限的等待之中。形成这种状况有几种缘由。多是某个程序内部逻辑有问题,或者,那个准备发送message的进程在发送Message以前挂掉了。函数

   因此,便有了这个带有超时的receive。这样就解决了上述问题。学习

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

   以下:it

   receiveio

      Pattern1 [when Guard1]->程序

        Expressions1;im

    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之外的其余语句来决定的程序中。

相关文章
相关标签/搜索