0

在 scala 中,假设您有一个很长的列表,并且您映射了一个对每个元素进行独立操作的函数:

val myList = List(....)
def fct(...) = {...}

myList.map(elem => fct(elem))

因为fct只使用val和不可变的操作,它可以很容易地并行化

myList.par.map(elem => fct(elem))

有一个for

for(elem <- myList) {
    fct(elem)
}

我的问题是如何在命令中显示一种进度条,显示我们在列表中的级别。我想到了类似的东西:

var i = o 

在循环之前和内部

i += 1
print(i + (" "*100) + "\r") 

但这会破坏并行化的可能性。

4

1 回答 1

6

一种方法是使用原子整数或长整数,具体取决于集合的大小,以使事情线程安全:

def trackProgress[T](fn:T => Unit, xs: collection.parallel.ParSeq[T]) {
  val total = xs.length
  val done = new java.util.concurrent.atomic.AtomicInteger()
  xs.foreach { x =>
    fn(x)
    val curDone = done.incrementAndGet()
    println("%s%% done".format(curDone.floatValue / total * 100))
  }
}

trackProgress(fct, myList.par)
于 2013-08-02T08:58:37.663 回答