gpt4 book ai didi

Scala并行计算并在一个方法返回结果时中断

转载 作者:行者123 更新时间:2023-12-02 04:39:17 24 4
gpt4 key购买 nike

给出了几种方法

def methodA(args:Int):Int={
//too long calculation
result
}

def methodB(args:Int):Int={
//too long calculation
result
}

def methodC(args:Int):Int={
//too long calculation
result
}

它们具有相同的参数集并返回相同类型的结果。

需要并行计算方法,当一个方法返回结果时我需要中断其他方法。

最佳答案

这是一个有趣的问题。我不太有经验,所以对于具有一些可取消的 future 实现的初学者来说,可能有一种更像 Scala 的方法来做到这一点。但是,我用简洁换取了可读性。

import java.util.concurrent.{Callable, FutureTask}

import scala.concurrent.{Await, Future}

import scala.concurrent.duration._

import scala.concurrent.ExecutionContext.Implicits.global

def longRunningTask(foo: Int => String)(arg: Int): FutureTask[String] = {
new FutureTask[String](new Callable[String]() {
def call(): String = {
foo(arg)
}
})
}
def killTasks(tasks: Seq[FutureTask[_]]): Unit = {
tasks.foreach(_.cancel(false))
}
val task1 = longRunningTask(methodA)(3)
val task2 = longRunningTask(methodB)(4)

val task1Future = Future {
task1.run()
task1.get()
}
val task2Future = Future {
task2.run()
task2.get()
}
val firstFuture = Future.firstCompletedOf(List(task1Future, task2Future))
firstFuture.onSuccess({
case result => {
println(result)
killTasks(List(task1, task2))
}
})

那么,我在这里做了什么?我创建了一个辅助方法,它创建了一个 FutureTask(来自 Java API),它对一些 Int 参数执行一个 Int => String 操作。我还创建了一个辅助方法,它可以杀死集合中的所有 FutureTask

之后,我使用两种不同的方法和输入创建了两个长时间运行的任务(这是您的工作)。

下一部分有点难看,基本上我用 Future monad 运行 FutureTasks 并调用 get 来获取结果。

在那之后,我基本上只使用 Future companion 中的 firstCompletedOf 方法来处理第一个完成任务,并在处理完成后终止其余任务。

我可能会努力使这段代码更好一些,但从这里开始。

您还应该尝试使用不同的 'ExecutionContext's, and parallelism levels. 进行检查

关于Scala并行计算并在一个方法返回结果时中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38804161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com