另一种特殊情况是超时为0时:
Run Code Online (Sandbox Code Playgroud)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
.
Run Code Online (Sandbox Code Playgroud)
在第一个函数中它等待1秒,在第二个函数中它不等待.
在这两种情况下,它都不显示文本(aa~n).
所以它不起作用after infinity.
如果不执行receive和之间的阻塞,after则上述2个代码可以简化为:
flush4() ->
okss
.
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
PS.我在Erlang R16B03-1上,我记得这本书的作者是在Erlang R13上.
Odo*_*rus 11
每个进程都有一个"邮箱" - 消息队列.消息可以通过'receive'获取.如果队列中没有消息.'after'部分指定'接收的时间将等待它们.所以.'0之后' - 表示进程检查(通过'receive')如果队列中的任何消息和队列是空的,则立即继续执行下一条指令.
例如,如果我们想要在这里定期检查是否有任何消息并且在没有消息的情况下做某事(希望有帮助),则可以使用它.
考虑after 0是finally.
考虑使用 来优先after 0处理s: http://learnyousomeerlang.com/more-on-multiprocessing#selective-receivesreceive
愿这种对事物的不同看法能够启发你。