消息的时间顺序

时间:2010-03-17 20:46:08

标签: erlang

通过Erlang ProgrammingProgramming Erlang阅读(略读以获得编码)。

一个问题,听起来很简单:

如果您在计算机Pid1上有一个进程m1,并且有一百万条消息被发送到Pid1,则是由该进程并行处理的消息(我得到的印象no)和(下面回答)

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

来自整个C /线程池/共享状态背景......我希望得到具体的结论。我理解分发应用程序,但希望确保在构建流程和分配工作负载之前,“原始骨骼”是我所期望的。

另外,我是否正确地认为整个世界目前正在浏览Erlang文本;)

3 个答案:

答案 0 :(得分:10)

如果进程A向进程B发送两条消息,则保证这两条消息按照发送顺序到达。

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

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

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

答案 1 :(得分:2)

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

关于消息排序:消息队列以“时间顺序”(从最旧到最新)扫描。我想想我记得很久以前的一个邮件列表讨论,其中有人澄清时间戳是消息来源的时间戳(即发送时间),但我记不住了太清楚了,我在网上找不到任何引用。

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

答案 2 :(得分:1)

根据erlang reference manual

  

[接收]接收发送给进程的消息   使用send运算符(!)。该   模式是顺序的   匹配第一条消息   邮箱中的时间顺序,然后   第二,等等。

每个进程都会按顺序处理邮件。