Erlang 在 0 之后接收
Erlang receive after 0
假设我有一个 Erlang 进程,其消息队列当前如下所示:
msg1
msg2
{timeout, Ref1, some_atom}
msg3
msg4
如果我这样做,消息队列会是什么样子:
receive
{timeout, Ref1, some_atom} ->
0
after 0
false
end
您可以在 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
消息.
- 命令 9 再次检查
Pid
消息队列。正如我们所见,代码接收到 {timeout, Ref1, some_atom}
元组并在队列中留下 msg1
和类似的原子。
命令 9 的结果正是我们所期望的,由于 Erlang 的选择性接收能力,导致它在接收消息时会遍历消息队列以找到第一个匹配项。如果在这种情况下没有匹配的消息,则会执行 after 0
子句,在这段代码中这意味着生成的函数将完成并且 Pid
将退出。
假设我有一个 Erlang 进程,其消息队列当前如下所示:
msg1
msg2
{timeout, Ref1, some_atom}
msg3
msg4
如果我这样做,消息队列会是什么样子:
receive
{timeout, Ref1, some_atom} ->
0
after 0
false
end
您可以在 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
消息. - 命令 9 再次检查
Pid
消息队列。正如我们所见,代码接收到{timeout, Ref1, some_atom}
元组并在队列中留下msg1
和类似的原子。
命令 9 的结果正是我们所期望的,由于 Erlang 的选择性接收能力,导致它在接收消息时会遍历消息队列以找到第一个匹配项。如果在这种情况下没有匹配的消息,则会执行 after 0
子句,在这段代码中这意味着生成的函数将完成并且 Pid
将退出。