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

scala – 奇怪的并行收集行为

发布时间:2020-12-16 19:19:56 所属栏目:安全 来源:网络整理
导读:我正在尝试使用 scala并行集合来实现一些cpu密集型 任务,我想抽象出算法的执行方式 (顺序,并行或甚至分布),但代码不能像我一样工作 会怀疑,我不知道我做错了什么. 我想抽象出这个问题的方式如下: // just measures time a block of code runsdef time(block
我正在尝试使用 scala并行集合来实现一些cpu密集型
任务,我想抽象出算法的执行方式
(顺序,并行或甚至分布),但代码不能像我一样工作
会怀疑,我不知道我做错了什么.

我想抽象出这个问题的方式如下:

// just measures time a block of code runs
def time(block: => Unit) : Long = {
  val start = System.currentTimeMillis
  block
  val stop = System.currentTimeMillis
  stop - start
}

// "lengthy" task
def work = {
  Thread.sleep(100)
  println("done")
  1
}

import scala.collection.GenSeq


abstract class ContextTransform {
  def apply[T](genSeq: GenSeq[T]): GenSeq[T]
}

object ParContextTransform extends ContextTransform {
  override def apply[T](genSeq: GenSeq[T]): GenSeq[T] = genSeq.par
}

// this works as expected
def callingParDirectly = {
  val range = (1 to 10).par

  // make sure we really got a ParSeq
  println(range) 
  for (i <- range) yield work
}

// this doesn't 
def callingParWithContextTransform(contextTransform: ContextTransform) = {
  val range = contextTransform(1 to 10)

  // make sure we really got a ParSeq
  println(range)
  for (i <- range) yield work
}

解释器的结果:

scala> time(callingParDirectly)
ParRange(1,2,3,4,5,6,7,8,9,10)
done
// ...
done
res20: Long = 503

scala> time(callingParWithContextTransform(ParContextTransform))
ParRange(1,10)
done
// ...
done
res21: Long = 1002

我的第一个赌注是该系列没有正确拆分和println的
“完成”确实表明……但如果我不屈服,上面的代码效果很好
任何事情(只需运行工作方法).

我无法理解为什么callingParWithContextTransform方法不起作用
比如callingParDirectly;我错过了什么?

解决方法

可能的罪魁祸首: SI-4843.

(编辑:李大同)

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

    推荐文章
      热点阅读