加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读