IT TIP

스칼라의 Akka, 느낌표 및 물음표

itqueen 2020. 11. 23. 20:42
반응형

스칼라의 Akka, 느낌표 및 물음표


Actors에게 메시지를 보낼 때 느낌표 ( !)와 물음표 ( ) 의 차이점은 무엇입니까 ??

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

뻔뻔 스럽게 복사 된 [멋진] 공식 문서 ( 자세한 내용은 메시지 보내기 섹션 참조) :

메시지는 다음 방법 중 하나를 통해 액터에게 전송됩니다.

!예를 들어 메시지를 비동기 적으로 보내고 즉시 반환하는 것과 같은 "실행 후 잊어 버림"을 의미합니다. 라고도합니다 tell.

?비동기 적으로 메시지를 보내고 Future가능한 응답을 나타내는를 반환합니다 . 라고도합니다 ask.


보기의받는 사람의 관점에서, 그것은보고 tellask같은 방법으로 메시지를 표시합니다. 그러나 tell의 값을 수신 할 때 sender메시지를 보낸 액터의 참조가되는 반면 ask,의 경우 요청을 한 액터 sender에서 Future생성 된 모든 응답이 전달되도록 설정됩니다 .

ask에서는받은 응답이 요청한 메시지의 결과임을 쉽게 알 수있는 반면, Tell에서는 유사한 결과를 얻으려면 고유 한 ID를 사용해야 할 수 있다는 장점 이 있습니다. 그러나와 ask당신은 설정해야합니다 timeout(가) 후 Future응답이 수신되지 않으면 오류가 발생합니다.

아래 코드에서 a 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!"
  }
}

참고URL : https://stackoverflow.com/questions/17644273/akka-in-scala-exclamation-mark-and-question-mark

반응형