一、并发编程模型AKKA

    Spark使用底层通信框架AKKA
分布式
master
worker
hadoop使用的是rpc 1)akka简介
写并发程序很难,AKKA解决spark这个问题。
akka构建在JVM平台上,是一种高并发、分布式、并且容错的应用工具包
akka用scala语言编写同时提供了scala和java的开发接口
akka可以开发一些高并发程序。 2)Akka的Actor模型
akka处理并发的方法基于actor模型
在基于actor的系统中,所有事物都是actor。
actor作为一个并发模型设计和架构的,面向对象不是。
actor与actor之间只能通过消息通信。 Akka特点:
(1)对并发模型进行了更高的抽象
(2)异步、非阻塞、高性能的事件驱动编程模型
(3)轻量级事件处理(1G内存可以容纳百万级别的Actor)
同步:阻塞(发消息 一直等待消息)
异步:不阻塞(发消息 不等待 该干嘛干嘛)
actor简化了并发编程,提高了程序性能。

1、Actor模型

2、Actor工作机制

二、AKKA编程

1、需求  我发消息,自己收

object CallMe {
//1.创建ActorSystem 用ActorSystem创建Actor
private val acFactory = ActorSystem("AcFactory")
//2.Actor发送消息通过ActorRef
private val callRef = acFactory.actorOf(Props[CallMe],"CallMe") def main(args: Array[String]): Unit = {
//3.发送消息
callRef ! "你吃饭了吗"
callRef ! "很高兴见到你"
callRef ! "stop"
}
} class CallMe extends Actor{
//Receive用户接收消息并且处理消息
override def receive: Receive = {
case "你吃饭了吗" => println("吃的鸡腿")
case "很高兴见到你" => println("我也是")
case "stop" => {
//关闭代理ActorRef
context.stop(self)
//关闭ActorSystem
context.system.terminate()
}
}
}

结果:

2.需求  一个Actor发送消息,另外一个Actor接收消息

(1)TomActor

import akka.actor.Actor

class TomActor extends Actor{
override def receive: Receive = {
case "你好,我是John" => {
println("你好,我是Tom")
} case "我爱Tom" => {
println("Tom也爱John")
}
}
}

(2)JohnActor

import akka.actor.{Actor, ActorRef}

class JohnActor(val h:ActorRef) extends Actor{
override def receive: Receive = {
case "你好,我是John" => {
//John发送消息给TomActor
h ! "我爱Tom"
}
}
}

(3)QqDriver

import akka.actor.{ActorSystem, Props}

object QqDriver {
//1.创建ActorSystem 用ActorSystem创建Actor
private val qqFactory = ActorSystem("QqFactory")
//2.Actor发送消息通过ActorRef
private val hRef = qqFactory.actorOf(Props[TomActor],"Tom")
//John需要接受Tom发送的消息
private val dRef = qqFactory.actorOf(Props(new JohnActor(hRef)),"John") def main(args: Array[String]): Unit = {
//1.Tom自己给自己发送消息
//hRef ! "我爱Tom" //2John给Tom发送消息
dRef ! "你好,我是John"
}
}

(4)结果

3、maven依赖pom文件

    <!-- 定义版本常量 -->
<properties>
<encoding>UTF-8</encoding>
<scala.version>2.11.8</scala.version>
<scala.compat.version>2.11</scala.compat.version>
<akka.version>2.4.17</akka.version>
</properties> <dependencies>
<!-- 添加scala包的依赖 -->
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency> <!-- 添加akka包的actor依赖 -->
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-actor_${scala.compat.version}</artifactId>
<version>${akka.version}</version>
</dependency> <!-- 多进程之间的Actor通信设置 -->
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-remote_${scala.compat.version}</artifactId>
<version>${akka.version}</version>
</dependency>
</dependencies> <!-- 指定使用插件-->
<build>
<!-- 指定源码包和测试包的位置信息 -->
<sourceDirectory>src/main/scala</sourceDirectory>
<testSourceDirectory>src/test/scala</testSourceDirectory>
<plugins>
<!-- 指定编译scala的插件 -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
<configuration>
<args>
<arg>-dependencyfile</arg>
<arg>${project.build.directory}/.scala_dependencies</arg>
</args>
</configuration>
</execution>
</executions>
</plugin> <!-- maven打包使用的插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>reference.conf</resource>
</transformer>
<!-- 指定main方法 -->
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.itstaredu.spark.SparkWorker</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

Scala并发编程模型AKKA的更多相关文章

  1. 15. Scala并发编程模型Akka

    15.1 Akka介绍 1) Akka是Java虚拟机JVM平台上构建高并发.分布式和容错应用的工具包和运行时,可以理解成Akka是编写并发程序的框架 2) Akka用Scala语言写成,同时提供了S ...

  2. Scala进阶之路-并发编程模型Akka入门篇

    Scala进阶之路-并发编程模型Akka入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Akka Actor介绍 1>.Akka介绍 写并发程序很难.程序员不得不处 ...

  3. Scala-Unit7-Scala并发编程模型AKKA

    一.Akka简介 Akka时spark的底层通信框架,Hadoop的底层通信框架时rpc. 并发的程序编写很难,但是Akka解决了spark的这个问题. Akka构建在JVM平台上,是一种高并发.分布 ...

  4. 4、Java并发性和多线程-并发编程模型

    以下内容转自http://ifeve.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E6%A8%A1%E5%9E%8B/: 并发系统可以采用多种并发编程模型来实现. ...

  5. Scala 深入浅出实战经典 第66讲:Scala并发编程实战初体验

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  6. Scala并发编程【快速入门】

    1.简介 Scala的actor提供了一种基于事件的轻量级线程.只要使用scala.actors.Actor伴生对象的actor()方法,就可以创建一个actor.它接受一个函数值/闭包做参数,一创建 ...

  7. java 多线程——并发编程模型 学习笔记

                                                                                                 并发编程模型 ...

  8. Scala 深入浅出实战经典 第68讲:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...

  9. Scala 深入浅出实战经典 第67讲:Scala并发编程匿名Actor、消息传递、偏函数解析

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

随机推荐

  1. 对sssp项目搭建的补充,总错误处理。

    总错误处理,是为了在程序运行时代码出错能及时在控制台看出错误信息. 1. springMVC配置文件中: -------- 2.controller包中: 新建类FrameControllerAdvi ...

  2. 模拟Excel中SUBSTITUTE函数

    Excel中的SUBSTITUTE是一个很有用的字符串替换函数,其说明如下: 说明 在文本字符串中用 new_text 替换 old_text. 如果需要在某一文本字符串中替换指定的文本,请使用函数 ...

  3. MathType中常见的两种符号的运用

    想要让公式编辑得快速又高效,MathType数学公式编辑器这个神助攻是少不了的.MathType是一款专用的数学公式编辑器,用它来编辑公式非常方便实用,并且排版也非常简单.下面介绍两种常见符号的应用. ...

  4. Ext3.4--TreeGridDemo

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CategoryProper ...

  5. Linux上Nginx部署配置

    一.下载软件 openssl-fips-2.0.10.tar.gz pcre-8.40.tar.gz zlib-1.2.11.tar.gz nginx-1.10.2.tar.gz gcc-c++ 下载 ...

  6. round()

    round() 用于对一个数值进行四舍五入,如果接收两个参数,则第二个参数表示保留多少位小数 In [1]: round(1.5324) Out[1]: 2.0 In [2]: round(1.532 ...

  7. Android的读写文件及权限设置

    drwx read write excute openFileOutput(name,drwx); 用系统api读取文件 设置文件生成的权限:    public static boolean sav ...

  8. 使用Node.js完成路由

    首先先看一下文件的结构: 我想通过改变不同的路由进不同的页面, 先看这几个HTML页面: 404: <!DOCTYPE html> <html lang="en" ...

  9. NSFileManager和NSFileHandle(附:获取文件大小 )

    本文转载至:http://www.cnblogs.com/pengyingh/articles/2350345.html 天牛 感谢原创作者的硕果 //file 文件操作 NSFileManager  ...

  10. PyQt4开关按钮ToggleButton

    PyQt4没有开关按钮部件.但是我们可以使用在特殊状态下的QPushButton部件来创建开关按钮.而所谓的开关按钮就是一个具有按下和未按下两种状态的普通赶牛.用户可以通过单击按钮来切换其开或者关的状 ...