Scala并发编程模型AKKA
一、并发编程模型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的更多相关文章
- 15. Scala并发编程模型Akka
15.1 Akka介绍 1) Akka是Java虚拟机JVM平台上构建高并发.分布式和容错应用的工具包和运行时,可以理解成Akka是编写并发程序的框架 2) Akka用Scala语言写成,同时提供了S ...
- Scala进阶之路-并发编程模型Akka入门篇
Scala进阶之路-并发编程模型Akka入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Akka Actor介绍 1>.Akka介绍 写并发程序很难.程序员不得不处 ...
- Scala-Unit7-Scala并发编程模型AKKA
一.Akka简介 Akka时spark的底层通信框架,Hadoop的底层通信框架时rpc. 并发的程序编写很难,但是Akka解决了spark的这个问题. Akka构建在JVM平台上,是一种高并发.分布 ...
- 4、Java并发性和多线程-并发编程模型
以下内容转自http://ifeve.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E6%A8%A1%E5%9E%8B/: 并发系统可以采用多种并发编程模型来实现. ...
- Scala 深入浅出实战经典 第66讲:Scala并发编程实战初体验
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- Scala并发编程【快速入门】
1.简介 Scala的actor提供了一种基于事件的轻量级线程.只要使用scala.actors.Actor伴生对象的actor()方法,就可以创建一个actor.它接受一个函数值/闭包做参数,一创建 ...
- java 多线程——并发编程模型 学习笔记
并发编程模型 ...
- Scala 深入浅出实战经典 第68讲:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...
- Scala 深入浅出实战经典 第67讲:Scala并发编程匿名Actor、消息传递、偏函数解析
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
随机推荐
- 【Android实战】Android中处理崩溃异常
public class MainActivity extends ActionBarActivity { public CrashApplication application; @Override ...
- PHPOffice下PHPWord生成Word2007(docx)使用方法
要正常使用,下载依赖包: PhpOffice/Common:https://github.com/PHPOffice/Common Zend/Escaper:https://github.com/ze ...
- 使用Visual Studio将C#生成DLL文件的方法
1.命令方式 打开Visual Studio安装目录下的开发人员命令提示 译 File.cs 以产生 File.exe csc File.cs 编译 File.cs 以产生 File.dll csc ...
- MathType中输入破折号的教程
MathType公式编辑器中的包含的各种数学符号与模板已经足够我们在编辑公式时使用了,但是除此之外,MathType还有一些符号并不是数学专有的符号,但是在数学中也偶尔会用到,比如破折号.MathTy ...
- IIS 使用多个https和通配证书解决方案
环境:OS :WINDOWS 2008 IIS: IIS7 域名:三个二级域名 问题:由于一个网站只支持一个443,但可以通过更改配置得到绑定不同域名.但由于公用证书,所以问题出来.只能为一个二级域名 ...
- mysql数据库使用mysqldump工具针对一个数据库备份,使用--databases选项与不使用该参数的区别
需求描述: 今天在做mysqldump备份某个数据库的试验,在备份某个数据库的时候可以使用 --databases参数,也可以直接进行某个数据库的备份,那么这里记录下两者的区别 操作过程: 1.使用- ...
- diamond types are not supported at this language level
在intellij导入git项目之后出现 diamond types are not supported at this language level错误 或者String等报错 File->P ...
- bootstrap之表单
一.表单布局 向父 <form> 元素添加 role="form". 把标签和控件放在一个带有 class .form-group 的 <div> 中.这是 ...
- console输出图案
探索天猫控制台下的图案是怎么制作的 通过它的源码找到以下代码(还原解压代码) 自己也照葫画瓢搞了个以前公司的logo
- 【BZOJ2668】[cqoi2012]交换棋子 费用流
[BZOJ2668][cqoi2012]交换棋子 Description 有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第i行第j列 ...