异步如何在基于 Actor 的系统中工作?
How asynchrony works in Actor based system?
我理解在基于 actor 的系统中,比如 Akka,Actor 是孤立工作的,不直接交互。相反,他们互相发送消息。演员只是发送一条消息并转到其他任务。这有助于避免阻塞。
但是如果 actor 在没有响应的情况下无法前进,那么它如何帮助实现异步行为? actor 不需要等待响应吗?
通常,actor 不应该等待响应来继续执行。一个actor接收和发送消息,这是他们的目的,但是一个actor的进度是多少?。参与者可以实现协议或成为协议的一部分,但阻止内部线程执行等待某个事件的发生并不是一个好主意。
class SomeActor(receiver: ActorRef) extends Actor {
case SomeMessage(msg) =>
receiver ! s"Hey ${msg}"
case SomeResponse(resp) =>
println(s"Received response ${resp}"
}
在这个例子中,actor 处理异步 SomeMessage 事件,一旦它们到达,它就会将它们发送给另一个,但它永远不会停止。在任何时候都会收到对 "Hey .. " 消息的响应,并且 actor 将执行打印消息的操作。
另一种可能的实现方式:
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 没有任何意义,至少我不会这样做。
我理解在基于 actor 的系统中,比如 Akka,Actor 是孤立工作的,不直接交互。相反,他们互相发送消息。演员只是发送一条消息并转到其他任务。这有助于避免阻塞。
但是如果 actor 在没有响应的情况下无法前进,那么它如何帮助实现异步行为? actor 不需要等待响应吗?
通常,actor 不应该等待响应来继续执行。一个actor接收和发送消息,这是他们的目的,但是一个actor的进度是多少?。参与者可以实现协议或成为协议的一部分,但阻止内部线程执行等待某个事件的发生并不是一个好主意。
class SomeActor(receiver: ActorRef) extends Actor {
case SomeMessage(msg) =>
receiver ! s"Hey ${msg}"
case SomeResponse(resp) =>
println(s"Received response ${resp}"
}
在这个例子中,actor 处理异步 SomeMessage 事件,一旦它们到达,它就会将它们发送给另一个,但它永远不会停止。在任何时候都会收到对 "Hey .. " 消息的响应,并且 actor 将执行打印消息的操作。
另一种可能的实现方式:
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 没有任何意义,至少我不会这样做。