2010-03-17 77 views
5

通过Erlang ProgrammingProgramming Erlang阅读(已足以获取编码)。邮件的时间顺序

一个问题,因为它的声音是那么简单:

如果你有机器m1上的进程Pid1和十亿百万条消息被发送到Pid1 是通过并行处理处理的邮件(我得到印象没有)和 (在下面回答)

在处理消息时是否有任何订单保证?即。收到订单发送?如果是这样,那么在高流量情况下如何处理时钟偏差以进行排序?

来自整个C /线程池/共享状态背景......我想要得到这个具体的。我明白分发一个应用程序,但要确保在构建过程和分配工作量之前,“原始骨骼”是我期望的。

而且,我是正确的思维全世界目前通过二郎山文本轻弹;)

回答

10

如果进程A向进程B发送了两条消息,那么这两条消息会按照它们发送的顺序保证到达。

如果进程A向进程B发送消息,然后向进程C发送消息,则不能保证它们的接收顺序。

同样,如果进程A & B向C发送消息,则不能保证消息的接收顺序。

这是消息传递模型的基本属性,不同进程中计算的排序是未定义的,你只能有意义地谈论排序消息发送的位置。上述规则的一个结果是,如果A向C发送消息,然后向B发送消息,并且在收到消息B发送给C时,则C可以以任何顺序接收这两个消息。(实际上,我怀疑这在单个节点上永远不会逆转,但如果三个进程位于不同节点上,则很容易发生。)

+0

+1,一个很好的答案。我对消息传递的思考现在更加清楚了,如果A和B向C发送了很多消息,那么没有(A和B消息联合的)顺序是具体的。我认为在设计中考虑“放置关注点”的因素。 – 2010-03-17 21:34:38

+0

Joe Armstrong作了一个我真正喜欢的类比(http://armstrongonsoftware.blogspot.com/2006/08/concurrency-is-easy.html)。您获得的订单保证与一群人彼此交谈完全相同。 – cthulahoops 2010-03-17 23:58:18

+0

伟大的链接,谢谢! – 2010-03-18 11:20:48

2

的消息不能并行处理;毕竟,这只是一个过程。

至于消息排序:消息队列以“时间顺序”(从最旧到最新)扫描。我认为我记得很久以前的邮件列表讨论,其中有人澄清,时间戳是消息发起的时间戳(即它发送的时间),但我不记得太清楚,我可以没有找到任何关于在线的参考。

请注意,您的receive语句可以在传入消息队列的头部执行匹配,这当然会允许接收者从(时间)顺序中剔除传入消息。

+0

+1,谢谢Pointy。保持时间顺序标签是一个选项。我认为绝对秩序几乎是不可能的。好答案!我的信息将随着对始发过程的回应而出现。 Erlang同步时钟吗? – 2010-03-17 21:04:59

1

erlang reference manual

[收到]接收发送给使用发送操作者的处理 消息(!)。 模式Pattern依次为 与第一条消息中的 时间顺序在邮箱中匹配,然后是 秒,依此类推。

消息按每个进程顺序处理。

+0

+1,那里是啊:P如果时间戳是“发送时间”并且节点时钟有偏斜怎么办;在高流量的环境中,Erlang VM/libs会考虑到这一点吗? – 2010-03-17 21:08:50