如何使用scala Actors解决这个问题: 我有一个程序,可以找出给定路径下文件中标识符的频率。假设的编码是UTF-8。我想用scala actor解决同样的问题。
//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演员的概念。我对scala演员感到困惑。
答案 0 :(得分:3)
演员帮助进行并发设计。这没有什么可以并发的。那些想要 parallelism 的人,为了提高性能,有时候想要做的就是你正在做的事情:采取一些简单的文件系统改变,给它添加额外的线程,看看它是否更快。但是,这是一个磁盘,并且随机访问非常昂贵,因此您无法从并行处理,滥用Actor或其他方式中获益。
Scala的演员来自Erlang。因此,请查看Erlang设计师之一的Concurrency Oriented Programming in Erlang (pdf)是否可以帮助您了解它们的含义。他们并不是真的在为任务投掷线程以使这些任务更快。
帮助Scala演员的一些资源:
Actors in Scala - 它已于月底发布,但PrePrint PDF现已上市。