Mer*_*moz 0 parallel-processing scala progress-bar
在scala中想象你有一个很长的列表,你映射一个函数,对每个元素进行独立的操作:
val myList = List(....)
def fct(...) = {...}
myList.map(elem => fct(elem))
Run Code Online (Sandbox Code Playgroud)
由于fct只使用val和不可变操作,因此可以很容易地并行化
myList.par.map(elem => fct(elem))
Run Code Online (Sandbox Code Playgroud)
用for:
for(elem <- myList) {
fct(elem)
}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何在命令中有一个进度条,显示我们在列表中的级别.我想到了类似的东西:
var i = o
Run Code Online (Sandbox Code Playgroud)
在循环之前和内部
i += 1
print(i + (" "*100) + "\r")
Run Code Online (Sandbox Code Playgroud)
但这会破坏并行化的可能性.
一种方法是使用原子整数或长整数,取决于集合的大小,以使线程安全:
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)
Run Code Online (Sandbox Code Playgroud)