阿卡在斯卡拉,叹号和问号

在向演员发送信息时,叹号(!)和问号(?)有什么不同?

myActor ! Hello(value1)
myActor ? Hello(value1)
29014 次浏览

厚颜无耻地抄袭 [太棒了] 官方文件(更多内容请看 发送信息部分) :

消息通过以下方法之一发送给 Actor。

!的意思是“发射和忘记”,例如异步发送消息和 立即返回。也称为 tell

?发送消息 并返回一个表示可能答复的 Future。 也叫 ask

从接收者的角度来看,它以同样的方式看到 tellask消息。然而,当接收到一个 tell时,sender的值将是发送消息的参与者的参考值,而对于一个 asksender的设置使得任何答复都发送给在提出请求的参与者中创建的 Future

ask中有一个优势,那就是很容易知道您收到的响应肯定是您请求的消息的结果,而在 Tell 中,您可能需要使用唯一的 ID 来实现类似的结果。然而,对于 ask,您需要设置一个 timeout,在此之后,如果没有收到响应,Future将失败。

在下面的代码中,使用 tellask可以达到同样的效果。

import akka.actor.{Props, Actor}
import scala.concurrent.duration._
import akka.pattern.ask


class TellActor extends Actor {


val recipient = context.actorOf(Props[ReceiveActor])


def receive = {
case "Start" =>
recipient ! "Hello" // equivalent to recipient.tell("hello", self)


case reply => println(reply)
}
}


class AskActor extends Actor {


val recipient = context.actorOf(Props[ReceiveActor])


def receive = {
case "Start" =>
implicit val timeout = 3 seconds
val replyF = recipient ? "Hello" // equivalent to recipient.ask("Hello")
replyF.onSuccess{
case reply => println(reply)
}
}
}


class ReceiveActor extends Actor {


def receive = {
case "Hello" => sender ! "And Hello to you!"
}
}