在斯卡拉Akka,感叹号和问号
发送信息给演员时,感叹号( !
)和问号( ?
)有什么区别?
myActor ! new hello(value1) myActor ? new hello(value1)
无耻复制[真棒] 官方文档 (请看发送消息部分更多):
消息通过以下方法之一发送给angular色。
!
意味着“即忘即忘”,例如asynchronous发送消息并立即返回。 也被称为tell
。
?
asynchronous发送消息并返回代表可能回复的Future
。 也被称为ask
。
从收件人的angular度来看,它可以用同样的方式看待和ask
信息。 然而,当收到一个tell
时, sender
的值将是发送该消息的演员的参考,而对于一个ask
, sender
被设置为使得任何答复都进入在做出该询问的演员中创build的Future
。
ask
有一个好处,很容易知道您收到的回复肯定是您询问的信息的结果,而使用Tell时,您可能需要使用唯一的ID来获得类似的结果。 然而,如果没有收到回应, ask
你需要设置一个timeout
在此之后, Future
将会失败。
在下面的代码中, tell
和ask
产生相同的效果。
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!" } }