ScalaプログラミングActor入門(十)
6444 ワード
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の作成、起動、およびメッセージング
case classタイプのメッセージの送受信
Actor間でメッセージを送受信する
メッセージとFutureの同期
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 !! message。val reply = future()。