78

アクターにメッセージを送信するときの感嘆符 ( !) と疑問符 ( )の違いは何ですか??

myActor ! Hello(value1)
myActor ? Hello(value1)
4

2 に答える 2

26

受信者の視点から見るtellask、同じようにメッセージを表示します。tellただし、の値を受け取ると、senderはメッセージを送信したアクターの参照になりますが、 の場合ask、は、要求を行ったアクターで作成された にsender応答が送信されるように設定されます。Future

askには、受け取った応答が、要求したメッセージの結果であることを簡単に知ることができるという利点がありますが、Tell では、同様の結果を得るために一意の ID を使用する必要がある場合があります。ただし、aska を設定する必要があり、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!"
  }
}
于 2015-07-27T16:33:33.823 に答える