Scala中的Akka,感叹号和问号
Posted
技术标签:
【中文标题】Scala中的Akka,感叹号和问号【英文标题】:Akka in Scala, exclamation mark and question mark 【发布时间】:2013-07-12 17:30:00 【问题描述】:在向 Actor 发送消息时,感叹号 (!
) 和问号 (?
) 有什么区别?
myActor ! Hello(value1)
myActor ? Hello(value1)
【问题讨论】:
【参考方案1】:从收件人的角度来看,它看到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!"
【讨论】:
【参考方案2】:无耻复制[awesome]official doc(查看发送消息部分了解更多信息):
消息通过以下方法之一发送给 Actor。
!
表示“即发即弃”,例如异步发送消息和 立即返回。也称为tell
。
?
发送消息 异步并返回一个Future
表示可能的回复。 也称为ask
。
【讨论】:
对于任何对此感兴趣的人 - 请参阅 Scala 中的运算符重载:dzone.com/articles/operator-overloading-scala !意思是“即发即弃”。描述性再好不过了!以上是关于Scala中的Akka,感叹号和问号的主要内容,如果未能解决你的问题,请参考以下文章
TypeScript 中的问号+冒号双问号问号+点感叹号+点
TypeScript 中的问号+冒号双问号问号+点感叹号+点