消息接收的顺序是这样的(引自《Erlang并发编程》):
当receive尝试寻找一个匹配的消息的时候,它会依次对邮箱中的每一个消息尝试用给定的每个模式去进行
匹配。我们用下面的例子来解释其工作原理。
图(a)给出了一个进程的邮箱,邮箱里面有四个消息,依次是msg_1 、msg_2、msg_3 和msg_4 。运行
receive
msg_3 ->
end.
会匹配到邮箱中的msg_3 并导致它被从邮箱中删除。然后邮箱的状态会变成如(b)所示。当我们再运行
receive
msg_4 ->
...
msg_2 ->
...
end
的时候,receive会依次对邮箱中的每一个消息,首先尝试与msg_4 匹配,然后尝试与msg_2 匹配。结果
是msg_2匹配成功并被从邮箱中删除,邮箱的状态变成(c)那样。最后,运行
receive
AnyMessage ->
...
end
其中AnyMessage 是一个未绑定(unbound)的变量,receive会匹配到邮箱里的msg_1 并将其删除,邮箱中最终只剩下msg_4,如图5.2(d)所示。
个人理解:
进入receive后,会把邮箱里的消息和每个消息模式来匹配。比如在(b)时候,先用msg_1和第一个消息模式msg_4匹配,不合适,再和第二个消息模式msg_2匹配,不合适。再用msg_2和第一个消息模式msg_4匹配,不合适,再和第二个消息模式msg_2匹配,合适。所以把消息msg_2从邮箱删除。这是正确的步骤。我之前的理解是用msg_1和第一个消息模式msg_4不合适后,用第二个消息msg_2和第一个模式msg_4匹配,不合适,再用第三个消息msg_4和模式msg_4匹配,合适。结果认为删除了消息msg_4.。这样是不对的。。要先把每个消息和所有的模式都匹配过后,如果都不合适,再用下面的一个消息和每个模式去匹配。
阅读(3170) | 评论(0) | 转发(0) |