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

转载于:https://www.cnblogs.com/pearson/p/3289703.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值