Scala,等待在并行集合上执行foreach
Scala, waiting to execute foreach on parallel collection
我有如下代码
val g = new Graph(vertices)
//Firts part
(1 to vertices).par.foreach( i => g + new Vertex(i))
//Second part
for (i <- 1 to edges) {
val data = scala.io.StdIn.readLine()
val d = data.split(" ")
val v1 = d(0).toInt
val v2 = d(1).toInt
val length = d(2).toInt
g+(v1, v2, length)
}
我想顺序执行第一部分和第二部分代码。
目前for循环运行之前所有的Vertex都已经加到g中了。
在代码中 +(加上)定义将 Vertex 的新实例添加到 MutableList。
我是 scala 新手,请帮忙
并行收集只是将收集的计算并行化。添加边的计算的第二部分应该在添加顶点之后发生。
我假设可能是因为解析了一些根本不存在于顶点中的顶点,可能是一些空的 space 或类似的东西。
我不确定将顶点添加到图形时会发生什么,但是如果操作应该没有副作用,并行的 foreach 应该小心。请参阅 this 了解更多信息。可能这甚至都不相关。
您可以将每个调用包装在下面
new Thread(new Runnable {
override def run(): Unit = {
//Code part here:
}
}).start()
您还需要确保您的 Graph
实现是线程安全的,因为您将有两个线程同时修改它。
你似乎没有从任何一部分返回任何东西,但如果你是,你可以使用 Future
代替。有关详细信息,请参阅 here。
我找到了解决办法。我阅读了更多有关将新元素添加到并行集合的信息,这不是线程保存。我将 MutableList 替换为固定大小的数组,并按索引添加新元素。
下面的一些代码:
class Graph(val end: Int) {
private val vertices : Array[Vertex] = new Array[Vertex](end)
def +(index: Int, v: Vertex): Unit = {
vertices(index) = v
}
(...)
}
//Firts part
(1 to vertices).par.foreach( i => g + (i-1,new Vertex(i))) //add new vertex to array by index
我有如下代码
val g = new Graph(vertices)
//Firts part
(1 to vertices).par.foreach( i => g + new Vertex(i))
//Second part
for (i <- 1 to edges) {
val data = scala.io.StdIn.readLine()
val d = data.split(" ")
val v1 = d(0).toInt
val v2 = d(1).toInt
val length = d(2).toInt
g+(v1, v2, length)
}
我想顺序执行第一部分和第二部分代码。 目前for循环运行之前所有的Vertex都已经加到g中了。 在代码中 +(加上)定义将 Vertex 的新实例添加到 MutableList。
我是 scala 新手,请帮忙
并行收集只是将收集的计算并行化。添加边的计算的第二部分应该在添加顶点之后发生。
我假设可能是因为解析了一些根本不存在于顶点中的顶点,可能是一些空的 space 或类似的东西。
我不确定将顶点添加到图形时会发生什么,但是如果操作应该没有副作用,并行的 foreach 应该小心。请参阅 this 了解更多信息。可能这甚至都不相关。
您可以将每个调用包装在下面
new Thread(new Runnable {
override def run(): Unit = {
//Code part here:
}
}).start()
您还需要确保您的 Graph
实现是线程安全的,因为您将有两个线程同时修改它。
你似乎没有从任何一部分返回任何东西,但如果你是,你可以使用 Future
代替。有关详细信息,请参阅 here。
我找到了解决办法。我阅读了更多有关将新元素添加到并行集合的信息,这不是线程保存。我将 MutableList 替换为固定大小的数组,并按索引添加新元素。
下面的一些代码:
class Graph(val end: Int) {
private val vertices : Array[Vertex] = new Array[Vertex](end)
def +(index: Int, v: Vertex): Unit = {
vertices(index) = v
}
(...)
}
//Firts part
(1 to vertices).par.foreach( i => g + (i-1,new Vertex(i))) //add new vertex to array by index