阿卡Scala中,感叹号和问号
问题描述:
是什么感叹号(!
)和问号(?
)之间的差值将消息发送到演员的时候?阿卡Scala中,感叹号和问号
myActor ! new hello(value1)
myActor ? new hello(value1)
答
无耻复制[真棒]official doc(看发送消息部分,用于更多):
消息是通过以下方法之一发送到演员。
!
的意思是“发射后不管”,例如异步发送消息,并立即返回 。也被称为tell
。
?
异步发送消息 并返回代表可能回复的Future
。 亦称ask
。
答
从收件人的角度来看,它看到tell
和ask
消息的方式相同。然而,当收到tell
时,sender
的值将是发送该消息的演员的参考,而对于ask
,则设置sender
,使得任何答复都转到在进行询问的演员中创建的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!"
}
}