Quelle est la différence entre un point d'exclamation (!
) et un point d'interrogation (?
) lors de l'envoi de messages à Actors?Akka dans Scala, point d'exclamation et point d'interrogation
myActor ! new hello(value1)
myActor ? new hello(value1)
Quelle est la différence entre un point d'exclamation (!
) et un point d'interrogation (?
) lors de l'envoi de messages à Actors?Akka dans Scala, point d'exclamation et point d'interrogation
myActor ! new hello(value1)
myActor ? new hello(value1)
copié sans vergogne [impressionnant]official doc (regarder Envoyer des messages section pour plus):
Les messages sont envoyés à un acteur par l'une des méthodes suivantes.
!
signifie "ignorer", par ex. envoyer un message de manière asynchrone et retourner immédiatement. Également connu sous le nomtell
. De manière asynchrone, un message est renvoyé etFuture
représente une réponse possible. Également connu sous le nomask
.
Du point de vue du destinataire, il voit tell
et ask
messages de la même façon. Toutefois, lors de la réception d'un tell
la valeur de sender
sera la référence de l'acteur qui a envoyé le message, alors que pour un ask
, le sender
est configuré de sorte que toute réponse soit envoyée au Future
créé dans l'acteur qui a fait la demande.
ask
est un avantage, il est facile de savoir que la réponse que vous recevez est certainement le résultat du message que vous avez demandé, alors qu'avec Tell, vous devrez peut-être utiliser des ID uniques pour obtenir un résultat similaire . Cependant, avec ask
, vous devez définir un timeout
, après quoi le Future
échouera si aucune réponse n'est reçue.
Dans le code ci-dessous, le même effet est atteint avec tell
et 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!"
}
}