通过Erlang Programming和Programming Erlang阅读(略读以获得编码)。
一个问题,听起来很简单:
如果您在计算机Pid1
上有一个进程m1
,并且有一百万条消息被发送到Pid1
,则是由该进程并行处理的消息(我得到的印象no)和(下面回答)
处理邮件时是否有任何订单保证?即。收到订单发送?如果是这样,在高流量情况下如何处理时钟偏差以进行排序?
来自整个C /线程池/共享状态背景......我希望得到具体的结论。我理解分发应用程序,但希望确保在构建流程和分配工作负载之前,“原始骨骼”是我所期望的。
另外,我是否正确地认为整个世界目前正在浏览Erlang文本;)
答案 0 :(得分:10)
如果进程A向进程B发送两条消息,则保证这两条消息按照发送顺序到达。
如果进程A向进程B发送消息,然后向进程C发送消息,则无法保证它们的接收顺序。
同样,如果进程A& B向C发送消息,无法保证接收消息的顺序。
这是消息传递模型的基本属性,不同进程中的计算顺序是未定义的,您只能有意义地谈论涉及消息发送的排序。上述规则的一个结果是,如果A向C发送消息,则向B发送消息,并且在接收到消息B发送给C时,则C可以以任何顺序接收这两个消息。 (实际上,我怀疑这在单个节点上从不反转,但如果三个进程在不同的节点上,则很容易发生。)
答案 1 :(得分:2)
不会并行处理消息;毕竟,这只是一个过程。
关于消息排序:消息队列以“时间顺序”(从最旧到最新)扫描。我想想我记得很久以前的一个邮件列表讨论,其中有人澄清时间戳是消息来源的时间戳(即发送时间),但我记不住了太清楚了,我在网上找不到任何引用。
请注意,您的receive
语句可以在传入消息队列的头部执行匹配,这当然会允许接收者从(时间)顺序中选择传入消息。
答案 2 :(得分:1)
[接收]接收发送给进程的消息 使用send运算符(!)。该 模式是顺序的 匹配第一条消息 邮箱中的时间顺序,然后 第二,等等。
每个进程都会按顺序处理邮件。