第68讲:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析及其在Spark中的应用源码解析学习笔记

时间:2022-05-29 19:59:11
第68讲:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析及其在Spark中的应用源码解析 
学习笔记


actor子系统会管理一个或多个线程供线程使用
开发者只需要基于actor写消息驱动的代码,
不用关心actor与底层线程间的关系。
实际上我们也可以直接把actor当作线程使用


实战代码:
case class Person(name: String, age: Int)
class HellActor extends Actor{
    def act(){
        while(true){
            receive{
                case Person(name,age) => {
                    println("Name: " + name + " : " + "Age: " + age)
   sender ! "Echo!!!"
   
}
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)}  //接收其他线程线主线程发送的消息,非常重要!
//self.receiveWithin(1000){case msg => println(msg)}  //1000:指定超时时间,默认是阻塞的,如果不指定,则会一直阻塞下去。
    }
}


对于有界面的多线程编程非常重要。
例如用户与界面交互。


注意风险:
1)receive中case不匹配时,此actor可能被一些无关的消息占满而无法接收更多消息,
所以在实际编程时用case _ 方式,
2)消息发送是异步的。消息何时到达无法保证,所以写程序时不应该依赖于消息传来的顺序。
3)receive内部,代码执行是线性的,一次只会匹配一个case,不存在资源争论情况。
4)尽量不要把处理结果传给全局对象,消除全局共享。
一律应该把偏函数的计算结果以消息的方式传递给其他数据的消费者
发消息的方式:

a.设立全局actor; b.worker actor; c.发消息时指定actor


以上内容是学习王家林老师DT大数据课程整理的笔记,

DT大数据微信公众账号:DT_Spark  

scala第69讲视频观看链接:

http://yun.baidu.com/s/1pJtEubL

第1-69讲视频在我的百度网盘共享:http://pan.baidu.com/s/1qWK9CMo