gpt4 book ai didi

scala - 使用 Scala Actor 框架作为 fork-join 计算?

转载 作者:行者123 更新时间:2023-12-03 14:38:29 24 4
gpt4 key购买 nike

从理论上讲,是否有可能使用 Scala Actor Framework 进行一种类似于 JDK 7 的 Fork-Join 框架的异步分而治之计算?如果是这样,我如何用框架表达 FJ 问题 - 例如,教程合并排序概念?欢迎使用代码片段。

(我是基于 resource video 我在我的另一个 FJ related question 中得到了这个想法。)

最佳答案

Scala 确实具有 FJ 风格的并行性。它是调用 future ,它是 Actor 库的一部分

import scala.actors.Future
import scala.actors.Futures._

def mergeSort[A <% Ordered[A]](xs : List[A]) : List[A] = {
// merge is not interesting, it's sequential. The complexity lies in keeping it tail recursive
def merge[A <% Ordered[A]](accum : List[A], left : List[A], right : List[A]) : List[A] = {
(left, right) match {
case (lhead::ltail, rhead::rtail) =>
if (lhead <= rhead) merge(lhead :: accum, ltail, right)
else merge(rhead :: accum, left, rtail)
case (Nil, _) => accum reverse_::: right
case _ => accum reverse_::: left
}
}

// here's the parallel sort bit
def sort[A <% Ordered[A]](xs : List[A], length : Int) : List[A] = {
if (length <= 1) xs
else {
val leftLength = length / 2
val rightLength = length - leftLength
val (left, right) = xs splitAt leftLength

// fork
val leftFork = future { sort(left, leftLength) }
val rightFork = future { sort(right, rightLength) }

// join
val leftJoin = leftFork()
val rightJoin = rightFork()

// merge
merge(Nil, leftJoin, rightJoin)
}
}

sort(xs, xs.length)
}

现在,问题的核心。如果 Scala 没有 future ,你能不能根据 Actor 自己写一个。的确。它或多或少看起来像这样。
import scala.actors.Actor 
import scala.actors.Actor._

object MyFuture {
def apply[T](x : => T) : MyFuture[T] = {
val future = new MyFuture[T]

val act = actor {
react {
case sender : Actor => sender ! (future, x)
}
}

act ! self

future

}
}

class MyFuture[A] extends Function0[A] {
me =>

lazy val result = receive {
case (`me`, result) => result.asInstanceOf[A]
}

def apply() = result

}

你会像这样使用它
scala> val x = MyFuture(28 * 1000)
x: Foo.MyFuture[Int] = <function>

scala> x()
res4: Int = 28000

关于scala - 使用 Scala Actor 框架作为 fork-join 计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1149505/

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