scala中最简单的多线程形式

时间:2016-06-18 16:11:10

标签: scala apache-spark bigdata

所以,我有一部分代码如下所示。

for(a <- 0 until segments)
{
    // do something with elements at index a
}

什么是最简单的多线程类型,它允许我在一个单独的线程中执行该循环的每个元素。我还有每个线程需要访问的全局集合(由a索引)。我在互联网上看到的只是期货和演员,但它们很难掌握。我想要一些像OpenMP一样简单的东西。

我尝试了以下操作,但它给了我错误';' expected but '.' found. }} thread.start

for (a <- 0 until segments) {
    val thread = new Thread {
        override def run {
            // do something with elements at index a
        }} thread.start
}

2 个答案:

答案 0 :(得分:5)

我认为你正在为副作用执行代码。

以下代码有效。您收到错误,因为thread.start应该在一个单独的行中。

for (a <- 0 until 10) {
    val thread = new Thread {
        override def run(): Unit = { 
            // code
        }
    }
    thread.start()
}

你可以用期货替换它,使用一个线程池,它比产生大量线程要好得多。

for (a <- 0 until 10) {
    Future {
        // code
    }
}

然而,在任何一种情况下,你都无法等到它完成。您可以遍历该范围并返回Future,其中包含您使用第二个函数开始的每个期货的所有部分结果的列表。

val result: Future[List[Unit]] = Future.traverse((0 until 10).toList)(index => Future {
    // code
})

有一个Future结果,你可以等待它,即阻塞调用线程直到所有计算完成。

import scala.concurrent.duration._
import scala.concurrent.Await
Await.ready(result, 1.hour)

使用Await.result获取结果,Await.ready只需等到将来完成。

要等待启动它们时需要构建列表的线程,然后在每个线程上调用join

我认为您不需要更改现有代码以使用并行集合,但我可能不知道您的代码特有的内容。以下代码会将范围拆分为将并行处理的块。

for (a <- (0 until 10).par) {
   // code
}

对于并行集合,您无需等待,线程将被阻止,直到处理完所有内容。

答案 1 :(得分:1)

并行集合是错误的:它们不会要求您更改任何超出实际想要更改的代码:

 (0 until segments).par.foreach { a =>
    // code
 }