Scala Fork Join Pool,如何实现多个没有并发结构的任务
Scala Fork Join Pool, How to implement for multiple tasks that Do not have a Concurrent Structure
好的,所以我对 Scala 非常陌生(昨天开始)。我一直在阅读有关并发的文档,但未能找到如何 运行 在 fork Join Pool 中使用 Callables 处理更大的任务。这就是我在 Scala Java 中使用的草图。
private Object fjp{
val fjp:ForkJoinPool=new ForkJoinPool(Runtime.getRuntime.availableProcessors()*2)
var w:Int=0
def invokeObjects(collection:Collection[Callable[Map[String:Int]]]){
var futures=fjp.invokeAll(collection)
w=0
while(fjp.isQuiescent()==false && fjp.getActiveThreadCount()==0){
w=w+1
}
println("Checked "+w+" times")
for(i<-0 to futures.size()){
var mp=futures.get(i).get()
//add keys to a common list
//submit count with frequency to sparse matrix
//avoid a ton of locking
}
}
}
我如何将代码变成一个我可以不断调用的 forkjoin 池。如果可能的话,我可以在没有另一个列表的情况下使用 foreach 来获得结果吗?感谢您的帮助。它也会为我指明 Scala 的正确方向。
一般来说,我不会费心去完全遵循那条路。 Scala 有一个非常干净的范例,以便 运行 感觉更惯用的并行计算。
如果您不熟悉 Scala 中的异步计算,我建议您开始 reading this。
特别是,您可以定义and/or 重用几种 ExecutorContext 以获得您需要的线程池。或者,如果您不阻塞线程,则可以使用默认线程(默认情况下,每个内核只有一个线程)
好的,所以我对 Scala 非常陌生(昨天开始)。我一直在阅读有关并发的文档,但未能找到如何 运行 在 fork Join Pool 中使用 Callables 处理更大的任务。这就是我在 Scala Java 中使用的草图。
private Object fjp{
val fjp:ForkJoinPool=new ForkJoinPool(Runtime.getRuntime.availableProcessors()*2)
var w:Int=0
def invokeObjects(collection:Collection[Callable[Map[String:Int]]]){
var futures=fjp.invokeAll(collection)
w=0
while(fjp.isQuiescent()==false && fjp.getActiveThreadCount()==0){
w=w+1
}
println("Checked "+w+" times")
for(i<-0 to futures.size()){
var mp=futures.get(i).get()
//add keys to a common list
//submit count with frequency to sparse matrix
//avoid a ton of locking
}
}
}
我如何将代码变成一个我可以不断调用的 forkjoin 池。如果可能的话,我可以在没有另一个列表的情况下使用 foreach 来获得结果吗?感谢您的帮助。它也会为我指明 Scala 的正确方向。
一般来说,我不会费心去完全遵循那条路。 Scala 有一个非常干净的范例,以便 运行 感觉更惯用的并行计算。
如果您不熟悉 Scala 中的异步计算,我建议您开始 reading this。
特别是,您可以定义and/or 重用几种 ExecutorContext 以获得您需要的线程池。或者,如果您不阻塞线程,则可以使用默认线程(默认情况下,每个内核只有一个线程)