Scala并发编程【进阶】
- package com.dingxin.entrance
- import java.text.SimpleDateFormat
- import java.util.Date
- import scala.actors.Actor
- import scala.actors.Actor._
- /**
- * Created by zhen on 2019/1/24.
- */
- object My_Actor_Receive extends Actor{
- def act(){
- while(true){
- receive{
- case str : String => print(str + " ") // 模式匹配
- case dat : Date => println(new SimpleDateFormat("yyyy").format(dat))
- case _ => println("My heart will go on !")
- }
- }
- }
- }
- object Actor_Receive {
- def main(args: Array[String]) {
- val getMessage = actor{
- while(true){
- receive{
- case str : String => print(str) // 模式匹配
- case dat : Date => println(new SimpleDateFormat("yyyy").format(dat))
- case _ => My_Actor_Receive ! null // 消息转发
- }
- }
- }
- val sendMessage = actor{
- while(true){
- receive{
- case str : String => getMessage ! str + " " // 消息转发
- case dat : Date => getMessage ! dat
- case _ => getMessage ! null
- }
- }
- }
- sendMessage ! "Scala"
- sendMessage ! new Date()
- sendMessage ! 2020
- // 这种方式必须执行start开启,且都是并行执行,不确定先后顺序
- My_Actor_Receive.start()
- My_Actor_Receive ! "Spark"
- }
- }
结果1:
结果2:
信息交互
- package big.data.analyse.scala
- import scala.actors.Actor
- import scala.actors.Actor._
- /**
- * 消息发送与接收,可用于流计算测试的输入
- * Created by zhen on 2018/4/15.
- */
- object ActorTest {
- def main(args: Array[String]) {
- val actor = new HelloActor
- actor.start//启动actor消息机制
- var counter = 0
- while(counter<10){
- actor ! "Step " + counter //发送消息
- counter += 1
- Thread.sleep(2000)
- self.receive{case msg => println("返回结果:"+msg)} // 获取子线程的消息
- }
- }
- }
- class HelloActor extends Actor{
- def act(): Unit ={
- while(true){
- receive{
- case content : String => println("Message : " + content)
- sender ! content.split(" ")(1) // 向主线程发送消息
- }
- }
- }
- }
结果3:
loop+react
- package big.data.analyse.scala.actor
- import java.net.{UnknownHostException, InetAddress}
- import scala.actors.Actor
- import scala.actors.Actor._
- /**
- * Created by zhen on 2019/6/19.
- */
- object NameResolver extends Actor{
- def act(){
- loop {
- react {
- case Net (name, actor) => actor ! getIp(name)
- case msg => println("Unhandled message : " + msg)
- }
- }
- }
- def getIp(name : String) : Option[InetAddress] = {
- try{
- println(name)
- Some(InetAddress.getByName(name))
- } catch {
- case _ : UnknownHostException => None
- }
- }
- }
- case class Net(name : String, actor: Actor)
- object Actor_More_Effective {
- def main(args: Array[String]) {
- NameResolver.start
- NameResolver ! Net("www.baidu.com", self)
- NameResolver ! "www.xiaomi.com"
- for(i <- 1 until 10){
- NameResolver ! "小米" + i
- }
- println(self.receiveWithin(1000){case x => x})
- }
- }
结果4:
Actor详解
1.Actor是一个通信模型,Scala提供了Actor的实现
2.Spark1.6之前集群节点之间通信使用的是Akka,Akka底层是Actor实现的。Spark1.6之后,节点的通信变成Netty
3.Actor相当于我们理解的Thread,Actor的出现主要解决的是代码锁的问题
4.Actor底层通信实现用到了模式匹配
Scala并发编程【进阶】的更多相关文章
- 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 ...
- Scala 深入浅出实战经典 第66讲:Scala并发编程实战初体验
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- Scala并发编程react、loop代码实战具体解释
演示样例代码及凝视: //scala并发编程中的react和loop,共同特点: //通过线程存用的方式让性能有所提升. //Actor本身的运行,被actor子系统管理的时候,会有一个或者多个远程的 ...
- Scala并发编程【快速入门】
1.简介 Scala的actor提供了一种基于事件的轻量级线程.只要使用scala.actors.Actor伴生对象的actor()方法,就可以创建一个actor.它接受一个函数值/闭包做参数,一创建 ...
- 王家林系列之scala--第69讲:Scala并发编程react、loop代码实战详解
刚才看了一下,群里王家林老师又更新课程了,真为王老师的勤奋感到佩服,于是迫不及待的下载下来观看学习.本期讲的是关于scala并发编程的react.loop代码实战. 信息来源于 DT大数据梦工厂微信公 ...
- Scala函数式编程进阶
package com.dtspark.scala.basics /** * 函数式编程进阶: * 1,函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量: * 2, 函数更长用的方式 ...
- Scala并发编程
Scala的actor提供了一种基于事件的轻量级线程.只要使用scala.actors.Actor伴生对象的actor方法,就可以创建一个actor.它接受一个函数值/闭包做参数,一创建好就开始运行. ...
- Scala并发编程模型AKKA
一.并发编程模型AKKA Spark使用底层通信框架AKKA 分布式 master worker hadoop使用的是rpc 1)akka简介 写并发程序很难,AKKA解决spark这个问题. akk ...
- Scala实战高手****第12课:Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏
/** * 函数式编程进阶: * 1.函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量 * 2.函数更常用的方式是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称 ...
随机推荐
- centOS改编码
http://jingyan.baidu.com/article/ab69b270de8b4f2ca7189f1d.html cd /rootvim .bashrcLANG="zh_CN.G ...
- Django使用Channels实现WebSocket--下篇
希望通过对这两篇文章的学习,能够对Channels有更加深入的了解,使用起来得心应手游刃有余 通过上一篇<Django使用Channels实现WebSocket--上篇>的学习应该对Cha ...
- RabbitMQ系列(一)RabbitMQ在Ubuntu上的环境搭建
环境配置 Ubuntu Server 18.04 RabbitMQ 3.6.10 安装之前 我们使用apt-get进行RabbitMQ安装,在安装之前,强烈建议您把apt源换位国内,大大增加下载安装的 ...
- Yaml 文件中Condition If- else 判断的问题
在做项目的CI/ CD 时,难免会用到 Travis.CI 和 AppVeyor 以及 CodeCov 来判断测试的覆盖率,今天突然遇到了一个问题,就是我需要在每次做测试的时候判断是否存在一个环境变量 ...
- ZooKeeper系列(1):安装搭建ZooKeeper环境
ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk ZooKeeper有三种安装模式:单机安装(standalone ...
- SpringBoot学习(八)-->SpringBoot之过滤器、监听器
本文将直接使用@WebFilter和@WebListener的方式,完成一个Filter 和一个 Listener. 过滤器(Filter)和 监听器(Listener)的注册方法和 Servlet ...
- 第一册:lesson sixty nine.
原文: The car race. There is a car race near our town every year. In 1995 ,there was a very big race. ...
- 第一册:lesson sixty five.
原文: Not a baby. A:What are you going to do this evening Jill? B:I'm going to meet some friends, dad. ...
- TeamViewer 12\13\14 破解版(解决检测为商业用途的方式)
一.Windows系统下破解TeamViewer的方式 1.用Windows直接卸载本地的TeamViewer软件2.下载一个Everything软件,并安装好它(这是一个搜索本机文件的工具,超级好用 ...
- 4.6 explain 之 rows
一.说明 根据表统计信息及索引选用情况,大致估算出找到所需的记录所需读取的行数. 二.示例 关注我的公众号,精彩内容不能错过