Chinaunix首页 | 论坛 | 博客
  • 博客访问: 741703
  • 博文数量: 130
  • 博客积分: 2951
  • 博客等级: 少校
  • 技术积分: 1875
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-04 18:32
文章分类

全部博文(130)

文章存档

2013年(1)

2012年(129)

分类: Python/Ruby

2012-03-14 09:44:29

消息接收的顺序是这样的(引自《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.。这样是不对的。。要先把每个消息和所有的模式都匹配过后,如果都不合适,再用下面的一个消息和每个模式去匹配。
阅读(3126) | 评论(0) | 转发(0) |
0

上一篇:Erlang - 超时

下一篇:删除盘的脚本

给主人留下些什么吧!~~