【Scala】Actor并发编程实现单机版wordCount
对单个文本文件进行单词计数
import scala.actors.Actor
import scala.io.Source
//读取文件名称样例类
case class SubmitTask(fileName:String)
class Actor2WordCount extends Actor{
override def act(): Unit = {
loop{
react{
case SubmitTask(fileName) =>
//根据文件名称读取文件内容 Source.formFile
val fileContent: String = Source.fromFile(fileName).mkString
//拿到文件内容后进行分割
//首先文件有两行,所以按照换行符先进行分割 window系统:/r/n linux系统:/n mac OS系统:/r
val lines: Array[String] = fileContent.split("\r")
//再根据单词间的分隔符进行切割压平
val words: Array[String] = lines.flatMap(x => x.split(" "))
//还有一种写法
// val words = lines.flatMap(_.split(" "))
//每个单词都标记成一次
val countOne: Array[(String, Int)] = words.map(x => (x, 1))
//进行分组,把元祖第一个元素相同分配到一组
val groupedWords: Map[String, Array[(String, Int)]] = countOne.groupBy(_._1)
//mapValues方法可以作用于map中的v,操作之后和和之前的k返回构成一个新的map
val wordsCount: Map[String, Int] = groupedWords.mapValues(_.length)
println(wordsCount.toBuffer)
}
}
}
}
object WordCount{
def main(args: Array[String]): Unit = {
//创建Actor2WordCount对象
val actor = new Actor2WordCount
//启动Actor2WordCount
actor.start()
//发送待处理文件名称给Actor2WordCount
actor ! SubmitTask("/Users/zhaozhuang/Desktop/3、Scala/2、Scala第二天/wordCount/1.txt")
}
}
对多个文本文件进行单词计数
import scala.actors.{Actor,Future}
import scala.collection.mutable
import scala.collection.mutable.ListBuffer
import scala.io.{BufferedSource,Source}
//读取文件名称样例类
case class SubmitTask(fileName: String)
case class Reply(wordsCount: Map[String, Int])
class Actor2WordCount extends Actor {
override def act(): Unit = {
loop {
react {
case SubmitTask(fileName) =>
//根据文件名称读取文件内容 Source.formFile
val fileContent: String = Source.fromFile(fileName).mkString
//拿到文件内容后进行分割
//首先文件有两行,所以按照换行符先进行分割 window系统:/r/n linux系统:/n mac OS系统:/r
val lines: Array[String] = fileContent.split("\r")
//再根据单词间的分隔符进行切割压平
val words: Array[String] = lines.flatMap(x => x.split(" "))
//还有一种写法
// val words = lines.flatMap(_.split(" "))
//每个单词都标记成一次
val countOne: Array[(String, Int)] = words.map(x => (x, 1))
//进行分组,把元祖第一个元素相同分配到一组
val groupedWords: Map[String, Array[(String, Int)]] = countOne.groupBy(_._1)
//mapValues方法可以作用于map中的v,操作之后和和之前的k返回构成一个新的map
val wordsCount: Map[String, Int] = groupedWords.mapValues(_.length)
sender ! Reply(wordsCount)
// println(wordsCount.toBuffer)
}
}
}
}
object WordCount {
def main(args: Array[String]): Unit = {
//将要读取的文件路径封装到一个数组中
val files = Array("/Users/zhaozhuang/Desktop/3、Scala/2、Scala第二天/wordCount/1.txt",
"/Users/zhaozhuang/Desktop/3、Scala/2、Scala第二天/wordCount/2.txt",
"/Users/zhaozhuang/Desktop/3、Scala/2、Scala第二天/wordCount/3.txt")
//定义一个集合,用于保存每个actor处理完返回的状态
val futureSet: mutable.HashSet[Future[Any]] = new mutable.HashSet[Future[Any]]()
//定义一个集合,用于保存买个actor返回的结果
val resultList = new ListBuffer[Reply]
//循环遍历每一个文件
for (f <- files) {
//创建Actor2WordCount对象
val actor = new Actor2WordCount
//启动Actor2WordCount
actor.start()
//发送待处理文件名称给Actor2WordCount 异步消息且有返回值
val future = actor !! SubmitTask(f)
//把返回状态添加到future集合中
futureSet.+=(future)
}
//遍历futureSet,找出真正处理完的actor,提取其结果future.apply()
while (futureSet.size > 0){
val completeFuture: mutable.HashSet[Future[Any]] = futureSet.filter(x => x.isSet)
//提取处理的结果
for(f <- completeFuture){
val finalResult: Any = f.apply()
val reply: Reply = finalResult.asInstanceOf[Reply]
resultList += reply
//提取完结果后,把future从futureSet移除
futureSet.remove(f)
}
}
println(resultList.map(_.wordsCount).flatten.groupBy(_._1).mapValues(x => x.foldLeft(0)(_+_._2)))
}
}
【Scala】Actor并发编程实现单机版wordCount的更多相关文章
- 用scala的actor并发编程写一个单机版的WorldCount
前言:最近一段时间比较忙,也是比较懒了吧,好长时间没写博客了,新的一年到来,给自己一个小目标,博客坚持写下去,分享一下这历程!废话不多说,开始正题咯(希望大家喜欢!) 首先这算是一个scala程序的入 ...
- scala当中的Actor并发编程
注:Scala Actor是scala 2.10.x版本及以前版本的Actor. Scala在2.11.x版本中将Akka加入其中,作为其默认的Actor,老版本的Actor已经废弃. 1.什么是Sc ...
- *Scala API - 并发编程
- scala Actor -03
1.对于上一篇讲解的scala的一些补充 val files = Array[String]("a.txt","b.txt","c.txt" ...
- scala actor编程之对象传递
scala 最吸引人的一点就是actor并发编程了.但是纵观scala官方文档,baidu文档,IBM文档都写的通过字符串传呀传,如果用作actor编程说明当然没有问题.但是在正式开放中,光传字符串就 ...
- java并发编程 --并发问题的根源及主要解决方法
目录 并发问题的根源在哪 缓存导致的可见性 线程切换带来的原子性 编译器优化带来的有序性 主要解决办法 避免共享 Immutability(不变性) 管程及其他工具 并发问题的根源在哪 首先,我们要知 ...
- 【Scala】Scala多线程-并发实践
Scala多线程-并发实践 scala extends Thread_百度搜索 scala多线程 - 且穷且独立 - 博客园 Scala和并发编程 - Andy Tech Talk - ITeye博客 ...
- 大数据入门第二十一天——scala入门(一)并发编程Actor
注:我们现在学的Scala Actor是scala 2.10.x版本及以前版本的Actor. Scala在2.11.x版本中将Akka加入其中,作为其默认的Actor,老版本的Actor已经废弃 一. ...
- Scala 深入浅出实战经典 第68讲:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...
随机推荐
- Python刷CSDN阅读数(仅供娱乐)
#!/usr/bin/env python # -*- coding: utf-8 -*- """ @File:csdn_reads.py @E-mail:3649427 ...
- PHP代码审计理解(一)----Metinfo5.0变量覆盖
0x01 漏洞简介 这个漏洞是metinfo5.0变量覆盖漏洞,并且需要结合文件包含.我使用的cms版本是5.3,事实上已经修复了这个漏洞(5.0的cms源码已经找不到了哈),但是我们可以借他来学习理 ...
- jmeter if控制器使用
if控制器有两种用法 1.不勾选“interpret condition as variable expression” 直接输入我们需要判断的表达式即可,判断表达式为真时,执行if控制器下的请求 2 ...
- C++头文件问题
自己定义的头文件必须要用“***.h”系统头文件必须要用<***.h>stdafx.h 必须放在所有头文件的最前面(如果不放,debug版本没有问题:release版本有问题,会报错)
- # Unity 游戏框架搭建 2019 (三十四、三十五) 9 ~ 10 示例整理
第九个示例 目前代码如下: using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif namespace QFramework { p ...
- Java IO 流 -- 设计模式:装饰设计模式
在java IO 流中我们经常看到这样的写法: ObjectOutputStream oos = new ObjectOutputStream( new BufferedOutputStream(ne ...
- JasperReports入门教程(二):中文打印
JasperReports入门教程(二):中文打印 背景 在上一篇中我们介绍了JasperReport的基本入门,也展示了一个报表.但是我们的示例都是使用的英文,如果我们把需要打印的数据改为中文会怎么 ...
- 总结:js世界中的特殊符号
常用符号:+ ++ - -- || / /' && 等 这些基本上每天都能用到,但是 js 世界中有些特殊符号是不常用的,我也是偶然在阅读大神代码的时候发现的,一番查找之后得出了以下结 ...
- 【linux题目】第一关
详细的解答:https://github.com/Zoe233/Linux/blob/master/[题目]5.Linux了解程度测试题解析.ipynb 1. 创建一个目录/data 解答: mkdi ...
- 正则表达式(grep,awk,sed)和通配符
1. 正则表达式 1. 什么是正则表达式? 正则表达式就是为了处理大量的字符串而定义的一套规则和方法. 通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串. Linux正则 ...