2

我想在一个节目中使用演员,在这个节目中,我会对一些演员进行某种限制,就好像他们是队列一样。例如,假设我有一些应用更改事件的外部系统以及一些外部系统数据的缓存。所以我有2个演员:

  1. ChangeApplicationActor
  2. CacheActor

作为 的一部分ChangeApplicationActor,当我对外部系统中的某个实体应用更改时X,我想发送一些事件来告诉CacheActor同步:

val changeApplicationActor = actor { 
  loop {
    react {
      case ChangeInstruction(x) => 
        externalSystem.applyChange(x)
        cacheActor ! Sync(x)
    }
  }
}

但我现在有两个要求:

  1. 具有CacheActor内部状态,理想情况下我希望它Sync按顺序处理其指令
  2. 如果我最终在CacheActor收件箱中包含两个Sync(x)相同值的指令x,那么我想忽略第二个(即Sync对于任何给定的值,我应该只有一个待处理指令x

有没有办法强制一个演员是单线程的?有什么方法可以访问演员的邮箱并删除任何重复的事件?我不能避免实现CacheActoras, um, not an Actor吗?

4

1 回答 1

5

一个actor被保证一次只在一个线程上执行,并且actor邮箱中的消息是FIFO顺序的,所以#1就在那里。

2 比较棘手,因为它没有内置支持。演员有一个属性叫做“邮箱”。您可以直接访问邮箱,而不是通过接收或反应。您所要做的就是在处理完消息之前将匹配的同步消息从邮箱中拉出。执行此操作时,您必须在参与者上进行同步,以防止另一个线程在消息发送期间尝试将内容添加到邮箱。

应该注意的是,在actor上进行同步消除了库提供的死锁自由保证,并且会降低可伸缩性。但从实际的角度来看,你可能会没事的。

于 2009-06-17T11:39:15.047 回答