【发布时间】:2019-12-25 08:18:42
【问题描述】:
我正在阅读LYAE 关于超时的章节,但我无法理解在以下情况下会发生什么:
important() ->
receive
{Priority, Message} when Priority > 10 ->
[Message | important()]
after 0 ->
normal()
end.
normal() ->
receive
{_, Message} ->
[Message | normal()]
after 0 ->
[]
end.
1> c(multiproc).
{ok,multiproc}
2> self() ! {15, high}, self() ! {7, low}, self() ! {1, low}, self() ! {17, high}.
{17,high}
3> multiproc:important().
[high,high,low,low]
我不明白以下内容:
- 根据我的理解,说
after 0就像使用,,如果消息在receive子句中匹配,它会发生即使? - 读完第一条消息后,我们得到了
[15, important()],在第二次迭代中将调用normal,所以我们只有一只手[15, important() --3-rd call]和[7,normal() -fourth call]。 那么最终我们如何以某种方式最终得到两个连接在一起的列表。 - 阅读前 2 条消息后:
important 与 [15] normal(第一次通话)与[7]
现在normal()(第一次呼叫)已经在等待新消息,而important 现在将第二次呼叫normal(),所以现在在第二次呼叫中我们不会有[1] 吗?
我不明白[7] 和[1] 是如何合并的,因为它们来自对normal() 的单独调用。
我理解important(),因为结果被放在列表的末尾[Message,important()]。但normal() 的情况并非如此,因为它被important 调用并且每次它都应该创建一个新列表.
PS我添加了一张图片,以进一步解释我的困境。我想我现在明白了,最后两个分支会将他们的结果返回到[7,15],但我仍然不明白什么顺序。
【问题讨论】: