gpt4 book ai didi

erlang - `receive after 0` 的用途(也称为选择性接收)

转载 作者:行者123 更新时间:2023-12-01 07:10:28 24 4
gpt4 key购买 nike

来自 Learn You Some Erlang for Great Good!

Another special case is when the timeout is at 0:

flush() -> 
receive
_ -> flush()
after 0 ->
ok
end
.

When that happens, the Erlang VM will try and find a message that fits one of the available patterns. In the case above, anything matches. As long as there are messages, the flush/0 function will recursively call itself until the mailbox is empty. Once this is done, the after 0 -> ok part of the code is executed and the function returns.



我不明白 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
.

我缺少什么?

附:我在 Erlang R16B03-1 上,我记得这本书的作者是在 Erlang R13 上。

最佳答案

每个进程都有一个“邮箱”——消息队列。消息可以通过 receive 获取.如果队列中没有消息。 after部分指定接收等待它们的时间。所以after 0 -- 表示进程检查(通过 receive )如果队列中有任何消息并且队列为空,则立即继续下一个指令。

例如,如果我们想定期检查此处是否有任何消息,并在没有消息时执行某些操作(希望有帮助),则可以使用它。

关于erlang - `receive after 0` 的用途(也称为选择性接收),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22132494/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com