B22 - 058、Actor实战案例Ⅵ

初学耗时:0.5h

注:CSDN手机端暂不支持章节内链跳转,但外链可用,更好体验还请上电脑端。

一、Actor实战案例Ⅵ



记忆词:

  ...

B22 - 999、大数据组件学习⑲ - Scala


ギ 舒适区ゾ || ♂ 累觉无爱 ♀





一、Actor实战案例Ⅵ

需求:


用actor并发编程写一个单机版的WordCount,将多个文件作为输入,计算完成后将多个任务汇总,得到最终的结果。

  • 大致的思想步骤:
    1、通过loop +react 方式去不断的接受消息
    2、利用case class样例类去匹配对应的操作
    3、其中scala中提供了文件读取的接口Source,通过调用其fromFile方法去获取文件内容
    4、将每个文件的单词数量进行局部汇总,存放在一个ListBuffer中
    5、最后将ListBuffer中的结果进行全局汇总。
package cn.zrk.actor
import java.io.File
import scala.actors.{Actor, Future}
import scala.collection.mutable
import scala.io.Source

case class SubmitTask(fileName: String)
case class ResultTask(result: Map[String, Int])
class Task extends Actor {
  override def act(): Unit = {
    loop {
      react {
        case SubmitTask(fileName) => {
          val contents = Source.fromFile(new File(fileName)).mkString
          val arr = contents.split("\r\n")
          val result = arr.flatMap(_.split(" ")).map((_, 1)).groupBy(_._1).mapValues(_.length)
          //val result = arr.flatMap(_.split(" ")).map((_, 1)).groupBy(_._1).mapValues(_.foldLeft(0)(_ + _._2))
          sender ! ResultTask(result)
        }
      }
    }
  }
}

object WorkCount {
  def main(args: Array[String]) {
    val files = Array("d://aaa.txt", "d://bbb.txt","d://ccc.txt")
    val replaySet = new mutable.HashSet[Future[Any]]
    val resultList = new mutable.ListBuffer[ResultTask]
    for(f <- files) {
      val t = new Task
      val replay = t.start() !! SubmitTask(f)
      replaySet += replay
    }
    while(replaySet.size > 0){
      val toCumpute = replaySet.filter(_.isSet)
      for(r <- toCumpute){
        val result = r.apply()
        resultList += result.asInstanceOf[ResultTask]
        replaySet.remove(r)
      }

    }
    val finalResult = resultList.map(_.result).flatten.groupBy(_._1).mapValues(x => x.foldLeft(0)(_ + _._2))
    println(finalResult)
  }
}




选婿莫选田园,选女莫选嫁奁。

- - - - - - - - - - - - - - - - - - - - - - - - - - - -



^ 至此,Actor实战案例Ⅵ完成。


- - - - - - - - - - - - - - - - - - - - - - - - - - - -


※ 世间诱惑何其多,坚定始终不动摇。

Eclipse文本编辑器中查找下一个操作的快捷键是( )


A、Ctrl+K
B、Ctrl+Z
C、CtrI+C
D、Ctrl+X

A
B22 - 058、Actor实战案例Ⅵ



选婿莫选田园,选女莫选嫁奁。

- - - - - - - - - - - - - - - - - - - - - - - - - - - -


注:CSDN手机端暂不支持章节内链跳转,但外链可用,更好体验还请上电脑端。

我知道我的不足,我也知道你的挑剔,但我就是我,不一样的烟火,谢谢你的指指点点,造就了我的点点滴滴:)!



选婿莫选田园,选女莫选嫁奁。


上一篇:GameMode 和 GameInstance


下一篇:B22 - 057、Actor实战案例Ⅴ