Scala 阿卡在演员们结束时跟踪

Scala 阿卡在演员们结束时跟踪,scala,akka,Scala,Akka,下面的代码遍历了一个人员列表,并在class1中为每个人调用回调 def syncPeople(callback: Person => _) = Future { person.findAll(criteria).foldLeft(0L) { (count, obj) => callback(obj) count + 1 } } 回调和对syncPeople的调用位于类2中,看起来与此类似 def getActor(person: Person

下面的代码遍历了一个人员列表,并在class1中为每个人调用回调

def syncPeople(callback: Person => _) = Future {
   person.findAll(criteria).foldLeft(0L) { (count, obj) =>
      callback(obj)
      count + 1
   } 
}
回调和对syncPeople的调用位于类2中,看起来与此类似

def getActor(person: Person):ActorRef = {
  if(person.isMale) maleActor
  else femaleActor
}

def process(person: Person): Unit = {
   val workActor = getActor(person)
   workActor ! person
} //The actor does the actual work and may be quite intense

def syncPeople(process)
现在,我想跟踪同步所有人所花费的总时间。当最后一个演员完成工作时。我正在使用第三个参与者:MonitorActor来跟踪开始和结束时间。当他们处理一个人时,男演员,女演员可以向这个发送消息

跟踪这些衍生过程的最佳方法是什么

我探索

Future.sequence//但是发送消息的工作参与者的类不是参与者。因此,未来不会收到这一信息

在PersonID完成时跟踪它们,但不使用var来在MonitorActor中累积接收到的消息这是不可能实现的。。使用var并不是做事情的首选方式


还有什么其他的方法可以实现这个

有趣的是,我正在研究一个与此非常相似的问题。我建议的解决方案是使用跟踪状态的方法

本质上,在状态对象之外的某个对象中,执行类似于生成表示id的Long的操作:

def getId(): Long = System.currentTimeMillis() / 1000L
正确实现时,状态对象是不可变的,因此您只需在整个事务中不断重用此id


我知道这个答案缺少很多实现细节,但我仍在自己的代码中进行实现。希望在阅读了一些关于akka fsm的内容并使用它之后,这个答案会有意义?

有趣的是,我目前正在研究一个与此非常类似的问题。我建议的解决方案是使用跟踪状态的方法

本质上,在状态对象之外的某个对象中,执行类似于生成表示id的Long的操作:

def getId(): Long = System.currentTimeMillis() / 1000L
正确实现时,状态对象是不可变的,因此您只需在整个事务中不断重用此id


我知道这个答案缺少很多实现细节,但我仍在自己的代码中进行实现。希望在阅读了一些关于akka fsm的内容并使用它之后,这个答案会有意义?

不要妖魔化可变状态,它是共享可变状态,这导致了大多数问题。在参与者内部没有共享的可变状态,因为您总是与actorRefs交谈,参与者一次只处理一条消息,没有种族条件和其他邪恶的东西。我想说的是,除非你在参与者内部产生了一些未来,这些未来会改变var,否则使用var是可以的,因为这样你就回到了共享可变状态。FSM是@devnulled建议的另一种解决方案,但它听起来更像是对您的用例的过度杀伤力。

不要妖魔化可变状态,它是共享可变状态,这会导致大多数问题。在参与者内部没有共享的可变状态,因为您总是与actorRefs交谈,参与者一次只处理一条消息,没有种族条件和其他邪恶的东西。我想说的是,除非你在参与者内部产生了一些未来,这些未来会改变var,否则使用var是可以的,因为这样你就回到了共享可变状态。FSM是@devnulled建议的另一种解决方案,但它听起来更像是对您的用例的过度使用。

感谢您的提示,我最终使用了akka FSM。。当有一个单一的请求时,它就像一个魅力。为了处理对syncPeople的多个请求,我最终为每个请求创建了一个FSM actor实例,并在syncPeople完成时停止它。不确定这是否是正确的方法。我最终没有使用getId。你能详细说明一下使用Id的方法吗?谢谢你的指针,我最终使用了akka fsm。。当有一个单一的请求时,它就像一个魅力。为了处理对syncPeople的多个请求,我最终为每个请求创建了一个FSM actor实例,并在syncPeople完成时停止它。不确定这是否是正确的方法。我最终没有使用getId。你能详细说明一下使用Id的方法吗。