Erlang在0之后收到

时间:2015-10-21 01:32:26

标签: erlang

假设我有一个Erlang进程,其消息队列目前如下所示:

msg1
msg2
{timeout, Ref1, some_atom}
msg3
msg4

如果我这样做,消息队列会是什么样子:

receive
    {timeout, Ref1, some_atom} ->
        0
after 0
    false
end

1 个答案:

答案 0 :(得分:6)

您可以在shell中尝试查找:

1> Pid = spawn(fun F() -> receive start -> receive {timeout, Ref1, some_atom} -> F() after 0 -> ok end end end).
<0.47.0>
2> Pid ! msg1.
msg1
3> Pid ! msg2.
msg2
4> Pid ! {timeout, erlang:make_ref(), some_atom}.
{timeout,#Ref<0.0.8.133>,some_atom}
5> Pid ! msg3.
msg3
6> Pid ! msg4.
msg4
7> erlang:process_info(Pid, messages).
{messages,[msg1,msg2,
           {timeout,#Ref<0.0.8.133>,some_atom},
           msg3,msg4]}
8> Pid ! start.
start
9> erlang:process_info(Pid, messages).
{messages,[msg1,msg2,msg3,msg4]}
  • 命令1会创建一个等待接收Pid原子的进程start,然后执行您在问题中指定的receive
  • 命令2-6在Pid中创建与您的问题匹配的邮件队列。
  • 命令7验证Pid消息队列是否符合预期。
  • 命令8发送start原子以使Pid执行您在问题中指定的receive,然后返回并等待另一条start消息。< / LI>
  • 命令9再次检查Pid消息队列。我们可以看到,代码收到了{timeout, Ref1, some_atom}元组,并在队列中留下了msg1和类似的原子。

由于Erlang的选择性接收能力,命令9的结果正是我们所期望的,这使得它在查看接收消息时通过消息队列查找第一个匹配。如果在这种情况下没有匹配的消息,则after 0子句将执行,在此代码中将表示生成的函数将完成并且Pid将退出。