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】:

从收件人的角度来看,它看到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!"
  

【讨论】:

【参考方案2】:

无耻复制[awesome]official doc(查看发送消息部分了解更多信息):

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

! 表示“即发即弃”,例如异步发送消息和 立即返回。也称为tell

? 发送消息 异步并返回一个Future 表示可能的回复。 也称为ask

【讨论】:

对于任何对此感兴趣的人 - 请参阅 Scala 中的运算符重载:dzone.com/articles/operator-overloading-scala !意思是“即发即弃”。描述性再好不过了!

以上是关于Scala中的Akka,感叹号和问号的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript 中的问号+冒号双问号问号+点感叹号+点

TypeScript 中的问号+冒号双问号问号+点感叹号+点

如何从字符串中删除除字母、数字、空格、感叹号和问号之外的所有内容?

swift中问号和感叹号有啥区别?

Swift 类型推断需要问号或感叹号

Java的方法参数中的双感叹号和#号是啥意思?