首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用scala参与者框架作为fork-join计算?

使用scala参与者框架作为fork-join计算?
EN

Stack Overflow用户
提问于 2009-07-19 08:54:07
回答 1查看 4K关注 0票数 16

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

(我的想法是基于我在另一台FJ related question上得到的resource video。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-07-19 14:15:01

Scala确实有FJ风格的并行性。它是call futures的一部分,也是演员库的一部分

代码语言:javascript
复制
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没有未来,你可以基于参与者自己编写一个吗?确实如此。它看起来或多或少是这样的。

代码语言:javascript
复制
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

}

你可以这样使用它

代码语言:javascript
复制
scala> val x = MyFuture(28 * 1000)
x: Foo.MyFuture[Int] = <function>

scala> x()
res4: Int = 28000
票数 33
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1149505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档