Erlang “0后接收”的用途(也称为选择性接收)
从 另一种特殊情况是超时值为0时:Erlang “0后接收”的用途(也称为选择性接收),erlang,Erlang,从 另一种特殊情况是超时值为0时: flush() -> receive _ -> flush() after 0 -> ok end . 当这种情况发生时,ErlangVM将尝试找到一条适合的消息 可用模式之一。在上面的例子中,任何内容都匹配。作为 只要存在消息,flush/0函数就会递归调用 直到邮箱为空。完成此操作后,0-> ok部分代码被执行,函数返回 我不明白0之后的目的。读了上面的文字后,我认为这就像是无限后的(永远等待),但我对
flush() ->
receive
_ -> flush()
after 0 ->
ok
end
.
当这种情况发生时,ErlangVM将尝试找到一条适合的消息
可用模式之一。在上面的例子中,任何内容都匹配。作为
只要存在消息,flush/0
函数就会递归调用
直到邮箱为空。完成此操作后,0->
ok部分代码被执行,函数返回
我不明白0之后的目的。读了上面的文字后,我认为这就像是无限后的(永远等待),但我对flush函数做了一些更改:
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
)。
所以它在无穷大之后不起作用
如果未执行接收
和之后的之间的块,则上述2个代码可简化为:
flush4() ->
okss
.
我错过了什么
另外,我在Erlang R16B03-1上,我记得这本书的作者当时在Erlang R13上 每个进程都有一个“邮箱”——消息队列。可以通过receive
获取消息。如果队列中没有消息after
part指定“接收”将等待他们多长时间。因此,0之后的表示进程检查(通过接收),如果队列中有任何消息,并且如果队列为空,则立即继续下一个指令
例如,如果我们希望定期检查此处是否有任何消息,并在没有消息时执行某些操作(希望有帮助)。您可以使用以下shell命令来了解after命令的效果:
4> L = fun(G) ->
4> receive
4> stop -> ok;
4> M -> io:format("received ~p~n",[M]), G(G)
4> after 0 ->
4> io:format("no message~n")
4> end
4> end.
#Fun<erl_eval.6.80484245>
5> F = fun() -> timer:sleep(10000),
5> io:format("end of wait for messages, go to receive block~n"),
5> L(L)end.
#Fun<erl_eval.20.80484245>
6> spawn(F).
<0.46.0>
end of wait for messages, go to receive block
no message
7> P1 = spawn(F).
<0.52.0>
8> P1 ! hello.
hello
end of wait for messages, go to receive block
received hello
no message
9> P2 ! hello, P2 ! stop.
* 1: variable 'P2' is unbound
8> P2 = spawn(F).
<0.56.0>
9> P2 ! hello, P2 ! stop.
stop
end of wait for messages, go to receive block
received hello
10>
4>L=fun(G)->
4> 接收
4> 停止->确定;
4> M->io:format(“接收到的~p~n”,[M]),G(G)
4> 0之后->
4> io:格式(“无消息~n”)
4> 结束
4> 结束。
#乐趣
5> F=fun()->计时器:睡眠(10000),
5> io:format(“等待消息结束,转到接收块~n”),
5> L(L)结束。
#乐趣
6> 产卵(F)。
等待消息结束,转到接收块
没有消息
7> P1=繁殖(F)。
8> P1!你好
你好
等待消息结束,转到接收块
收到你好
没有消息
9> P2!你好,P2!停止
*1:变量“P2”未绑定
8> P2=繁殖(F)。
9> P2!你好,P2!停止
停止
等待消息结束,转到接收块
收到你好
10>
认为0之后的是最后的
考虑在0之后使用以优先处理接收
s:
希望这种不同的观点能给你带来启发。当被视为最终代码分支时,它完全更有意义。