如何在基于Actor的系统中运行异步?

时间:2018-03-04 14:00:37

标签: akka actor

我理解在基于actor的系统中,像Akka一样,Actors独立工作,不直接交互。相反,他们互相发送消息。演员只是发送消息并转到其他任务。这有助于避免阻塞。

但如果没有响应,actor无法进展,那么它如何帮助实现异步行为呢?演员不需要等待回应吗?

1 个答案:

答案 0 :(得分:0)

通常,演员不应等待响应继续执行。演员接收并发送消息,这是他们的目的,但是一个演员的进步是什么?一个actor可以实现一个协议或成为它的一部分,但是阻止内部线程执行等待某个事件的发生并不是一个好主意。

class SomeActor(receiver: ActorRef) extends Actor {

   case SomeMessage(msg) => 
       receiver ! s"Hey ${msg}"

   case SomeResponse(resp) =>
       println(s"Received response ${resp}"

}

在此示例中,actor处理异步 SomeMessage事件,并且在它们到达时很快将它们发送到另一个但它永远不会停止。在任何时候,对“嘿......”消息的响应将会到来,并且演员将执行打印消息。

另一种可能的实施方式:

class SomeActor(receiver: ActorRef) extends Actor {
   case SomeMessage(msg) => 
     receiver ? s"Hey ${msg}" onComplete { case Success(resp) => 
        println(s"Received response ${resp}"
     }
}

我不使用它,但它不会阻止它。它为每个传入消息创建期货,并在未来的回调中处理响应。

以下内容与您的问题更相关:

class SomeActor(receiver: ActorRef) extends Actor {
   case SomeMessage(msg) => 
        val resp = Await.result(receiver ? s"Hey ${msg}")
        println(s"Received response ${resp}" 
     }
}

这会阻止未来的执行,但是这样你就可以将actor用作同步执行单元,所以在这些场景中使用actor没有任何意义,至少我不会这样做。