我理解在基于actor的系统中,像Akka一样,Actors独立工作,不直接交互。相反,他们互相发送消息。演员只是发送消息并转到其他任务。这有助于避免阻塞。
但如果没有响应,actor无法进展,那么它如何帮助实现异步行为呢?演员不需要等待回应吗?
答案 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没有任何意义,至少我不会这样做。