阿卡Scala中,感叹号和问号

问题描述:

是什么感叹号(!)和问号(?)之间的差值将消息发送到演员的时候?阿卡Scala中,感叹号和问号

myActor ! new hello(value1) 
myActor ? new hello(value1) 

无耻复制[真棒]official doc(看发送消息部分,用于更多):

消息是通过以下方法之一发送到演员。

!的意思是“发射后不管”,例如异步发送消息,并立即返回 。也被称为tell

?异步发送消息 并返回代表可能回复的Future。 亦称ask

从收件人的角度来看,它看到tellask消息的方式相同。然而,当收到tell时,sender的值将是发送该消息的演员的参考,而对于ask,则设置sender,使得任何答复都转到在进行询问的演员中创建的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!" 
    } 
}