第十七课:Scala并发编程实战
其实我们可以发现,我们一直处在并发编程的世界里
Spark 有以前是使用Akka的,Akka是对Scala的Actor进行了封装
Scala的Actor有点像邮件,一个人发邮件到邮箱,另外一个人可以接收到邮件进行处理,处理之后回复邮件,
其实Scala的Actor是非常像邮件的
其实Spark用的是多台机器的并发编程,它的实质和单台机器的并发编程没有太大的区别,只不过多台机器的并发编程需要一个框架来管理,
例如怎么知道Master,Worker是谁,怎么去找地址
在Spark的源码中,我们可以看到EventLoop也是一种并发编程,只不过这和Worker,Master的并发编程有所不一样
Actor其实就是内部有一个消息队列,不断地循环这个消息队列,待消息处理完成之后,该消息就会消失
例子:
package com.dt.spark.scala.basics
import scala.actors.Actor
object HelloActor {
def main(args: Array[String]) {
val helloActor=new HelloActor()
helloActor.start()
var helloBackActor=new HelloBackActor(helloActor)
helloBackActor.start()
var i=0
// while(true){
// i += 1
// helloActor ! i+""
// Thread.sleep(1000)
// }
// helloActor ! Hello("Spark","Dollor")
// helloActor ! HelloBack("Spark","Dollor")
}
}
case class Hello(name:String,content:String,sender:Actor)
case class HelloBack(name:String,content:String,sender:Actor)
class HelloActor extends Actor {
var counter:Int=0
override def act() {
while (true) {
receive {
case Hello(name,content,sender) =>
println("Hello,"+name+":" + content)
counter += 1
Thread.sleep(1000)
sender ! HelloBack(name,content+counter,this)
}
}
}
}
class HelloBackActor(val actor:Actor) extends Actor {
var counter:Int=0
override def act() {
actor ! Hello("Spark","Dollor",this)
while (true) {
receive {
case HelloBack(name,content,sender) =>
println("Hello,"+name+":" + content)
counter += 1
Thread.sleep(1000)
sender ! Hello(name,content+counter,this)
}
}
}
}
!是异步的,!?就是同步的方式,必须等到对方给你回复才继续工作
归纳总结:1.Scala的Actor的大概原理
2.多台机器的并发编程和单台机器的并发编程
3.看一下Spark 的 EventLoop
4.例子
转载于:https://my.oschina.net/u/1449867/blog/729808