【问题标题】:How to use scala actors如何使用 Scala 演员
【发布时间】:2011-12-03 04:31:28
【问题描述】:

如何使用 scala Actors 解决这个问题: 我有一个程序可以找出给定路径下文件中标识符的频率。假定的编码是 UTF-8。我想用 scala 演员解决同样的问题。

//program to find frequencies of identifiers
import java.io._
import java.util.concurrent._
import java.util.concurrent.atomic._

object Main {
  // visit all files in dir
  def processDirectory(dir: File, visit: (File) => Unit) {
    for (f <- dir.listFiles) 
      if (f.isDirectory) processDirectory(f, visit)
      else visit(f)
  }

  //counters for all identifiers
  val frequencies = new scala.collection.mutable.HashMap[String, Int]

  // Finds all identifiers in a file and increments their counters
  def process(f: File) {
    val contents = scala.io.Source.fromFile(f, "UTF-8").mkString
    val pattern = "[a-zA-Z_][0-9a-zA-Z_]*".r
    for (m <- pattern.findAllIn(contents))
      frequencies(m) = frequencies.getOrElse(m, 0) + 1
  }

  def main(args: Array[String]) {   //Give path of a directory here
    processDirectory(new File(args(0)), process _)

    println("Ten most common identifiers:")
    val sorted = frequencies.values.toBuffer.sortWith(_ > _)
    for (i <- 0 until 10)      
      for ((k, v) <- frequencies) 
        if (v == sorted(i)) println(k + " " + v)
  }
}

另外请解释 scala actor 的概念。我对 scala 演员感到困惑。

【问题讨论】:

    标签: multithreading scala actor


    【解决方案1】:

    Actor 有助于并发设计。这没有什么同时发生的。想要并行以提高性能的人,有时想要完全按照您正在做的事情去做:做一些简单的文件系统修改工作,向它添加额外的线程,看看它是否更快。然而,这是一个磁盘,随机访问是非常昂贵的,所以你无法从并行处理、Actor滥用或其他方面获得任何好处。

    Scala 的 Actor 来自 Erlang。因此,请查看 Erlang 的一位设计师的 Concurrency Oriented Programming in Erlang (pdf) 是否可以帮助您了解它们的含义。它们并不是真的要在任务中抛出线程以使这些任务运行得更快。

    一些有助于 Scala 演员的资源:

    【讨论】:

      猜你喜欢
      • 2013-06-16
      • 2018-05-23
      • 2011-01-20
      • 2011-01-30
      • 1970-01-01
      • 2010-10-07
      • 2014-06-29
      • 2019-04-23
      • 1970-01-01
      相关资源
      最近更新 更多