Rya*_*yan 24
在演员中使用期货最安全的方法是只使用pipeTo未来并将其结果作为消息发送给演员(可能是同一个演员).
import akka.pattern.pipe
object MyActor {
  def doItAsynchronously(implicit ec: ExecutionContext): Future[DoItResult] = { 
  /* ... */ 
  }
}
class MyActor extends Actor {
  import MyActor._    
  import context.dispatcher  
  def receive = {
    case DoIt =>
      doItAsynchronously.pipeTo(self)
    case DoItResult =>
       // Got a result from doing it
  }
}
这可以确保您不会改变actor中的任何状态.
qwe*_*we2 -1
如果您需要在未来改变状态而不阻止传入消息,您可能需要重新考虑重新设计您的参与者模型。我将为您将使用这些 future 的每项任务引入单独的参与者。毕竟,Actor 的主要任务是维持其状态而不让它逃逸,从而提供安全的并发性。为那些长期运行的任务定义一个参与者,其职责只是处理该任务。
您可能需要考虑使用akka 的 FSM,而不是手动处理状态,这样您就可以更清晰地了解何时发生变化。当我处理更复杂的系统时,我个人更喜欢这种方法而不是丑陋的变量。