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

问题描述 投票:0回答:1

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

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

akka actor
1个回答
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没有任何意义,至少我不会这样做。

© www.soinside.com 2019 - 2024. All rights reserved.