ScalaプログラミングActor入門(十)


ScalaプログラミングActor入門引用
ScalaのActorはJavaのマルチスレッドプログラミングに似ています.しかし、異なる点は、ScalaのActorが提供するモデルがマルチスレッドとは異なることです.ScalaのActorはできるだけロックと共有状態を回避し,マルチスレッド同時発生時のリソース競合を回避し,マルチスレッドプログラミングの性能を向上させる.さらに,Scala Actorのこのモデルは,デッドロックなどの一連の従来のマルチスレッドプログラミングの問題を回避することもできる.
Sparkで使われている分散型マルチスレッドフレームワークは、Akkaです.AkkaもScala Actorのようなモデルを実現し,その核心概念も同様にActorである.したがって,Scala Actorを把握すれば,Sparkソースコード研究においては,少なくともAkka Actorに関するコードが分かる.しかし、言い換えれば、Spark内部には大量のAkka Actorが使用されているため、Scala Actorについても少なくとも把握しなければならず、Sparkソースコードを学ぶことができない.
Actorの作成、起動、およびメッセージング
// Scala   Actor trait          actor     , Actor trait    Java  Thread Runnable  ,            。      Actor trait act  ,            , Java   run    。
//   ,  start()    actor;  !  , actor    ;actor    receive         

//   :Actor Hello World
import scala.actors.Actor

class HelloActor extends Actor {
  def act() {
    while (true) {
      receive {
        case name: String => println("Hello, " + name)
      }
    }
  }
}

val helloActor = new HelloActor
helloActor.start()
helloActor ! "leo"

case classタイプのメッセージの送受信
// Scala Actor   Java        ,         ,Scala Actor             ;   actor     actor      。             。
//     actor    ,    “actor !   ”   。 scala ,         , case class         。   actor      ,    scala                   。
//   :          
case class Login(username: String, password: String)
case class Register(username: String, password: String)
class UserManageActor extends Actor {
  def act() {
    while (true) {
      receive {
        case Login(username, password) => println("login, username is " + username + ", password is " + password)
        case Register(username, password) => println("register, username is " + username + ", password is " + password)
      }
    }
  }
}
val userManageActor = new UserManageActor
userManageActor.start()
userManageActor ! Register("leo", "1234"); userManageActor ! Login("leo", "1234")

Actor間でメッセージを送受信する
//     Actor         ,  scala    ,  actor     actor     ,         ;  actor        ,         actor   ,         。
//   :   
case class Message(content: String, sender: Actor)
class LeoTelephoneActor extends Actor {
  def act() {
    while (true) {
      receive {
        case Message(content, sender) => { println("leo telephone: " + content); sender ! "I'm leo, please call me after 10 minutes." }
      }
    }
  }
}
class JackTelephoneActor(val leoTelephoneActor: Actor) extends Actor {
  def act() {
    leoTelephoneActor ! Message("Hello, Leo, I'm Jack.", this)
    receive {
      case response: String => println("jack telephone: " + response)
    }
  }
}

メッセージとFutureの同期
//      ,       ;               ,      ,          ,      !?       。 val reply = actor !? message。

//            ,              ,      Future!!val future = actor !! messageval reply = future()。