Scala,等待在并行收集上执行foreach

时间:2015-06-29 13:08:00

标签: scala foreach parallel-collections

我的代码如下

    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)
        }

我想按顺序执行代码的第一部分和第二部分。 目前在所有Vertex添加到g之前进行循环运行。 在代码+(加号)中定义将Vertex的新实例添加到MutableList。

我是scala的新手,请帮忙

3 个答案:

答案 0 :(得分:0)

并行集合仅与集合的计算并行化。添加边的计算的第二部分应该在添加顶点之后发生。

我假设可能是解析可能有一些顶点根本不存在于顶点,可能是一些空的空间或类似的东西。

我不确定在向图形添加顶点时发生了什么,但如果操作应该没有副作用,那么并行的foreach应该小心。有关详细信息,请参阅this。可能这甚至都不相关。

答案 1 :(得分:0)

您可以在以下

中打包每个电话
new Thread(new Runnable {
  override def run(): Unit = {
    //Code part here:
  }
}).start()

您还需要确保您的Graph实现是线程安全的,因为您将有两个线程同时修改它。

看起来你不是从任何一个部分返回任何东西,但如果你是,你可以使用Future代替。有关详细信息,请参阅here

答案 2 :(得分:0)

我找到了解决方案。我阅读了更多关于向并行收集添加新元素的内容,而不是线程保存。我将MutableList替换为fixedsize数组,并按索引添加新元素。

以下一些代码:

-(BOOL)webView:(UIWebView *)mainWebView shouldStartLoadWithRequest: (NSURLRequest *)request navigationType:UIWebViewNavigationType)navigationType 
{

  if (navigationType == UIWebViewNavigationTypeLinkClicked) {
    NSLog(@"clicked string:%@",request.URL.absoluteString; 
  }
}