使用akka actor中的未来回调

13 concurrency scala future callback akka

我在Akka docs中找到了:

在使用未来的回调时,例如onComplete,onSuccess和onFailure,你需要小心避免关闭包含actor的引用,即不要在回调中调用方法或访问封闭actor上的可变状态.

那么这是否意味着我应该总是使用future pipeTo self然后调用一些函数?或者我仍然可以使用方法回调,那么我应该如何避免并发错误呢?

mon*_*ack 12

这意味着:

class NotThreadSafeActor extends Actor {

  import context.dispatcher

  var counter = 0

  def receive = {
    case any =>
      counter = counter + 1
      Future {
        // do something else on a future
        Thread.sleep(2000)
      }.onComplete {
        _ => counter = counter + 1
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,actor的receive方法和Future的onComplete都会更改可变变量counter.在这个玩具示例中,它更容易看到,但Future调用可能是嵌套方法,同样捕获可变变量.

问题是onComplete调用可能在与actor本身不同的线程上执行,因此完全可以让一个线程执行receive而另一个执行,onComplete从而为您提供竞争条件.这首先否定了演员的观点.