使用Akka的Actors进行异步消息处理

Ser*_*kov 3 scala actor akka

在我的项目中,我正在使用Akka的演员.根据定义,Actors是线程安全的,这意味着在Actor的receive方法中

def receive = {
    case msg =>
        // some logic here
}
Run Code Online (Sandbox Code Playgroud)

一次只有一个线程处理注释的代码段.但是,当此代码异步时,事情开始变得更加复杂:

def receive = {
    case msg =>
        Future {
            // some logic here
        }
}
Run Code Online (Sandbox Code Playgroud)

如果我理解正确此,在这种情况下,只有未来的结构将同步,可以这么说,并没有逻辑里面的未来.

当然,我可以阻止未来:

def receive = {
    case msg =>
        val future = Future {
            // some logic here
        }
        Await.result(future, 10.seconds)
}
Run Code Online (Sandbox Code Playgroud)

这解决了问题,但我认为我们都应该同意这不是一个可以接受的解决方案.

所以这就是我的问题:在异步计算的情况下如何在阻塞Scala的期货的情况下保留actor的线程安全特性?

Yuv*_*kov 6

在没有块Scalas的异步计算的情况下,如何保留actor的线程安全特性Future

这个假设只有在你首先修改Future其中似乎是设计气味的actor的内部状态时才是真的.仅使用未来进行计算,方法是使用创建数据的副本并将管道计算到actor的计算结果pipeTo.一旦actor接收到计算结果,您就可以安全地对其进行操作:

import akka.pattern.pipe

case class ComputationResult(s: String)

def receive = {
  case ComputationResult(s) => // modify internal state here
  case msg =>
    Future {
       // Compute here, don't modify state
       ComputationResult("finished computing")
    }.pipeTo(self)
}
Run Code Online (Sandbox Code Playgroud)