从Learn You Some Erlang for Great Good!
另一种特殊情况是超时时间为0:
flush() ->
receive
_ -> flush()
after 0 ->
ok
end
.
当这种情况发生时,Erlang VM将尝试找到一个符合可用模式的消息。在上面的例子中,任何匹配都可以。只要有消息,flush/0
函数就会递归调用它自己,直到邮箱为空。一旦完成了这个操作,代码的after 0 ->
ok部分就会执行,函数返回。
我不明白after 0
的目的。阅读上面的文字后,我认为它就像after infinity
(永远等待),但我改变了一点冲洗功能:
flush2() ->
receive
_ -> timer:sleep(1000), io:format("aa~n"), flush()
after 0 ->
okss
end
.
flush3() ->
receive
_ -> io:format("aa~n"), flush()
after 0 ->
okss
end
.
在第一个函数中,它等待1秒,而在第二个函数中,它不等待。
在这两种情况下,它都不显示文本(aa~n
)。
所以它不像after infinity
那样工作。
如果不执行receive
和after
之间的块,则上述2个代码可以简化为:
flush4() ->
okss
.
我错过了什么?
附言:我在爱尔朗R16 B 03 -1上,这本书的作者,正如我记得的那样,是在爱尔朗R13上。
4条答案
按热度按时间icnyk63a1#
每个进程都有一个“邮箱”--消息队列。消息可以通过
receive
来获取。如果队列中没有消息,after
部分指定了“receive”将等待它们多长时间。因此after 0
--意味着进程检查(通过receive
)队列中是否有消息,如果队列为空,则立即继续下一个指令。例如,如果我们想定期检查这里是否有任何消息,如果没有消息,我们可以使用它来做一些事情(希望有帮助)。
8tntrjer2#
假设
after 0
是finally
。考虑使用
after 0
来处理具有优先级的receive
:http://learnyousomeerlang.com/more-on-multiprocessing#selective-receives愿这种对事物的不同看法启发你。
sxissh063#
您可以使用以下shell命令来了解after命令的效果:
kmbjn2e34#
如果您不打算使用嵌套接收,而不是使用“after”部分,我认为更好的方法是使用“Unexpected -〉”变量来处理所有不匹配的消息。