设为首页 加入收藏

TOP

Scala-Unit7-Scala并发编程模型AKKA
2019-08-15 00:11:08 】 浏览:60
Tags:Scala-Unit7-Scala 并发 编程 模型 AKKA

一、Akka简介

  Akka时spark的底层通信框架,Hadoop的底层通信框架时rpc。

  并发的程序编写很难,但是Akka解决了spark的这个问题。

  Akka构建在JVM平台上,是一种高并发、分布式、并且容错的应用工具包;

  Akka使用Scala语言编写,同时它提供了Scala和Java的开发接口,Akka可以开发一些高并发的程序。

 

二、Akka的Acor模型

  A卡卡处理并发的方法基于actor模型,在基于actor的系统中,所有事物都是actor(类似于Java的万物皆对象);

  actor是一个并发模型设计的架构,而面对对象不属于结构,它是一门思想;

 

  如上如,actor与actor直接只能通过消息通信,

  当一个actor给另一个actor发送消息时,只需要将消息发送给actor对应的代理(emailBox)即可,

  而actor怎么处理消息是我们自己定义的。

 

三、Akka特点

  1.对并发模型进行了更高的抽象;

  2.它是异步、非阻塞、高性能的事件驱动编程模型;

  3.它是一个轻量级的时间编程模型(1GB内存可以容纳百万级别的Actor)

  4.actor简化了并发编程,提高了程序的性能

 

四、Akka编程

  1.需求1:我对自己发送消息,并处理消息

//创建CallMe类继承Actor,它包含了对消息处理的业务逻辑
class CallMe extends Actor{
  //重写recevie方法,负责接收和处理消息
  override def receive: Receive = {
    case "Hunter is cool" => println("You are Right")
    case "Hunter is ugly" => println("You are wrong")
    case "stop" => {
      //关闭代理ActorRef
      context.stop(self)
      //关闭ActorSystem
      context.system.terminate()
    }
  }
}

object CallMe {
  //1.创建ActorSystem对象
  private val acFactory = ActorSystem("AcFactory")
  //2.调用ActorSystem对象的ActorOf方法,创建代理callRef
  private val callRef = acFactory.actorOf(Props[CallMe],"CallMe")

  def main(args: Array[String]): Unit = {
    //3.发送消息, !代表发送的意思
    callRef ! "Hunter is cool"
    callRef ! "Hunter is ugly"
    callRef ! "stop"
  }
}

  

  2.需求2:男孩和女孩的对话模拟

class BoyActor(val b:ActorRef) extends Actor{
  override def receive: Receive = {
    case "你好,mm" => {
      b ! "你好,mm"
    }
    case "你好,gg" => {
      println("你好,gg")
      b ! "我能约你吃饭么?"
    }
    case "叔叔,我们不约!" =>{
      println("叔叔,我们不约!")
      context.stop(self)
      context.system.terminate()
    }
  }
}

class GirlActor(val g:ActorRef) extends Actor{
  override def receive: Receive = {
    case "你好,mm" =>{
      println("你好,mm")
      g ! "你好,gg"
    }
    case "我能约你吃饭么?" =>{
      println("我能约你吃饭么?")
      g ! "叔叔,我们不约!"
    }
  }
}

object WeChat {
  private val weChat = ActorSystem("WeChat")
  private val boyRef: ActorRef = weChat.actorOf(Props(new BoyActor(girlRef)),"Boy")
  private val girlRef: ActorRef = weChat.actorOf(Props(new GirlActor(boyRef)),"Girl")

  def main(args: Array[String]): Unit = {
    boyRef ! "你好,mm"
  }
}

   运行结果:

   

 

  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Akka-CQRS(0)- 基于akka-cluste.. 下一篇Spark笔记(一):错误总结

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目