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方法不起作用 解决方法
可能的罪魁祸首:
SI-4843.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |