我尝试使用并行集合在Scala中并行执行文件系统操作。我想控制并发操作的数量(例如设置为2):
import scala.collection.parallel.ForkJoinTaskSupport
val filenames = (1 to 50).map(i=> "%03d".format(i)+".dat").par
filenames.tasksupport = new ForkJoinTaskSupport(new scala.concurrent.forkjoin.ForkJoinPool(2))
def doSmth(filename:String) = {
// simulate expensive FS operation
new java.io.PrintWriter(s"/home/myuser/$filename") { write("foo"); close }
Thread.sleep(2000)
}
filenames.foreach {i => doSmth(i)}
奇怪的是,所有文件都是同时写入的,而不是按预期每2秒写入2个文件。如果我使用new scala.concurrent.forkjoin.ForkJoinPool(1)
,我会得到预期的行为,但不会出现并行行为> 1