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