使用scala actor框架作为fork-join计算?
发布时间:2020-12-16 09:30:02 所属栏目:安全 来源:网络整理
导读:在理论上,使用Scala Actor框架可以像JDK 7的Fork-Join框架一样进行一种异步的划分和计算计算吗?如果是这样,我如何在框架中表达一个FJ问题 – 例如,教程合并概念?欢迎代码snipplet。 (我来到这个想法,基于resource video我已经在我的另一个FJ related q
在理论上,使用Scala Actor框架可以像JDK 7的Fork-Join框架一样进行一种异步的划分和计算计算吗?如果是这样,我如何在框架中表达一个FJ问题 – 例如,教程合并概念?欢迎代码snipplet。
(我来到这个想法,基于resource video我已经在我的另一个FJ related question.) 解决方法
Scala确实有FJ风格的并行性。这是电话期货,它是演员图书馆的一部分
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没有期货,你可以根据演员自己写一个。确实。它会看起来或多或少是这样的。 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |