Erlang “0后接收”的用途(也称为选择性接收)

Erlang “0后接收”的用途(也称为选择性接收),erlang,Erlang,从 另一种特殊情况是超时值为0时: flush() -> receive _ -> flush() after 0 -> ok end . 当这种情况发生时,ErlangVM将尝试找到一条适合的消息 可用模式之一。在上面的例子中,任何内容都匹配。作为 只要存在消息,flush/0函数就会递归调用 直到邮箱为空。完成此操作后,0-> ok部分代码被执行,函数返回 我不明白0之后的目的。读了上面的文字后,我认为这就像是无限后的(永远等待),但我对

另一种特殊情况是超时值为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:


希望这种不同的观点能给你带来启发。

当被视为最终代码分支时,它完全更有意义。