使用ask和tell时,消息在actor邮箱中的到达顺序

时间:2017-03-27 18:05:41

标签: scala akka actor

我对以下代码中邮件到达的邮件序列感到困惑:

class Product(models.Model):
    category = models.ForeignKey(Category,related_name='products')
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, db_index=True)
    image = models.ImageField(upload_to='products/%Y/%m/%d', blank=True)
    description = models.TextField(blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    stock = models.PositiveIntegerField()
    available = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ('name',)
        index_together = (('id', 'slug'),) 

    def __str__(self):
        return self.name

}

在驱动程序中,我向演员发送消息

class myAct extends Actor {
def receive = {
  case 1 =>
    println(1)
  case 2 =>
    sender ! 90
  case 3 =>
    println(3)
}

问题是邮件将以何种顺序传递到邮箱。 1总是先到达。 3将永远到达最后。是否有可能在1之前到达。

1 个答案:

答案 0 :(得分:0)

Message Ordering上有一个特定的文档部分。如果你的"驱动程序"是另一个演员然后顺序是明确的。来自文档:

  

规则更具体地说是对于一对特定的演员,   直接从第一个发送到第二个的消息不会   收到乱序。这个词直接强调了这一点   保证仅适用于使用tell运算符发送给   最终目的地,而不是在使用调解员或其他信息时   传播特征(除非另有说明)。

如果驱动程序不在Actor内,则default implicit senderActor.noSender。 Per Konrad的评论似乎在这种情况下仍然保留了排序。