scala中最简单的多线程形式

问题描述 投票:1回答:2

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

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
}
scala apache-spark bigdata
2个回答
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
投票

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

 (0 until segments).par.foreach { a =>
    // code
 }
© www.soinside.com 2019 - 2024. All rights reserved.