为什么演员收到的消息是无序的?

Bil*_*ill 10 concurrency scala actor

我一直在研究actor模型(特别是Scala中的实现)但我无法理解为什么要求消息没有按特定顺序到达.

似乎至少有一些优雅的,基于actor的并发问题解决方案,只有消息按顺序到达时才会起作用(例如,生产者 - 消费者变体,延迟数据库写入,并发安全缓存).

那么为什么演员的消息没有按顺序到达?它是允许有效实现还是可以防止在订购消息时出现某种死锁?

Rex*_*err 12

我的印象是,如果两个线程向一个演员发送一条消息a,那么演员首先会收到哪一个特别保证.但是如果你有代码看起来像

a ! "one"
a ! "two"
Run Code Online (Sandbox Code Playgroud)

然后a总是会得到"one"之前"two"(虽然谁知道还有什么可能从与其他线程到达).

因此,我不认为消息根本没有特定的顺序.来自一个线程内的多条消息(根据我从代码或经验中可以看出)将按顺序到达.

  • 但有一个例外 - 优先级消息队列. (2认同)

Dan*_*ral 9

我不知道为什么Scala的Actors(标准库中的那些,无论如何 - 还有Aka的Akka,Lift和Scalaz实现)选择了这个特定的实现.可能是Erlang自身限制的副本 - 但没有两个单线程之间通信的保证.或许也有这种保证 - 我希望Phillip Haller在这里发表评论.

但是,我确实质疑你关于并发问题的陈述.在研究异步分布式算法时,一个基本原则是您不能保证任何消息接收顺序.

引用Hagit Attiya和Jennifer Welch的分布式计算:基础,模拟和高级主题,

如果对于消息传递所花费的时间或处理器的连续步骤之间经过了多长时间没有固定的上限,则称系统是异步的.

actor模型是异步模型.这使它能够在分布式硬件上工作 - 无论是通过网络进行通信的不同计算机,还是不提供同步保证的系统上的不同处理器.

此外,甚至多核处理器上的多线程模型也大多是异步的,其中同步的原语非常昂贵.

所以问题的简单答案可能是:

消息不能保证按顺序到达,因为这是异步系统的基本限制,异步系统是actor使用的基本计算模型.

这个模型是我们在任何通过TCP/IP分布的系统上实际拥有的模型,也是i386/x64多核/多处理器硬件上最高效的模型.