码迷,mamicode.com
首页 > 其他好文 > 详细

DT大数据梦工厂 第68讲

时间:2015-07-26 14:01:27      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

DT大数据梦工厂第68讲
http://yun.baidu.com/s/1jGKSKAi
本节王老师讲了Actor的高级应用。首先,主线程可以发消息给子线程,而子线程接收并处理完消息以后,可以返回给主线程一个消息。这就像邮箱的回复。这里可以在receive偏函数中,写一个关键字 sender !后面就是要发送的内容。而main方法接收时,可以用self.receive偏函数,接收。而且,也可以设置超时时间,用self.receiveWithin(超时时间毫秒){偏函数}这种方式,其作用是当主线程接收时,要在一定的时间范围内接收到才有效,超时则无效。
这种用case class的方式来发送接收消息有2种好处,1是发送和接收的消息都不可以改变,这样就为我们并行的架构和分布式架构提供了方便,防止了资源争用2是可以采用模式匹配的方式,来传递一个复杂的对象。
为了防止一个actor收到的消息过多,因为如果receive中的判断条件过少,有大量的消息就会堆积在actor中,这样会使得actor的响应速度变慢,所以要加一个case _=println("Something else")这样把多余的消息处理了,就相当于我们的垃圾邮件。
为了不改变对象,尽量不要在Actor中加一个全局对象,来接收消息的改变并做处理。比如传递给一个currencyHashMap。因为Actor在设计的时候就是想要消除全局共享的。
在发送方发送时,可以指定接收方处理完返回的actor,这就相当于告诉对方处理完要发给谁。
也可以自己主动发送,self !一个actor。
case class Person(name:String,age:Int)
class HelloActor extends Actor{
def act(){
while(true){
receive{
case Person(name,age)=>{
println("Name: "+name+" "+"Age: "+age)//匹配到Person打印
sender ! "Echo!!!"//返回给发送方msg
}
case _=>println("Something else")//防止垃圾邮件
}
}
}
}
object Actor_With_CaseClass{
def main(args: Array[String]){
val hiActor=new HelloActor
hiActor.start
hiActor ! Person("Spark",6)
self.receive{case msg=>println(msg)}//接收msg这个关键字
//self.receiveWithin(1000){case msg=>println(msg)}
//加入超时时间
}
}

DT大数据梦工厂 第68讲

标签:

原文地址:http://www.cnblogs.com/trgaaaaa/p/4677506.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!