消息传送的Actor一般都会使用线程,Actor越多,线程占的资源也越多。
Scala提供的reaction和loop可以提供Actor的重用,以减少资源占用,提高性能。
loop方式的代码:
package com.dt.scala.actor
import scala.actors.Actor
import scala.actors.Actor._
import java.net.InetAddress
import java.net.UnknownHostExeption
object NameResolver extends Actor{
def act(){
loop {
react {
case Net (name, actor) =>
sender ! getIp(name)
act
case msg =>
println("Unhandled message : " + msg)
}
}
}
def getIp(name : String) : Option[InetAddress] = {
try{
println(InetAddress.getByName(name))
Some(InetAddress.getByName(name))
} catch {
case _ : UnknownHostException => None
}
}
}
case class Net(name : String, actor: Actor)
object Actor_More_effective {
def main(args: Array[String]) {
NameResolver.start
NameResolver ! Net("www.baidu.com", self)
println(self.receiveWithin(1000){case x => x})
}
}
以上loop可改用reaction方法的代码:
react {
case Net (name, actor) =>
sender ! getIp(name)
act
case "EXIT" => println("Name resolver exiting. ")
case msg =>
println("Unhandled message : " + msg)
act
}
利用再次调用act的方式。
代码参考DT大数据梦工厂团队王家林的授课内容。
信息来源于 DT大数据梦工厂微信公众账号:DT_Spark
视频:http://pan.baidu.com/s/1pJtEubL?qq-pf-to=pcqq.group