Scala平行收藏 – 如何早点回报?
我有一个可能的输入值的列表
val inputValues = List(1,2,3,4,5) 我有一个很长的计算功能给我一个结果 def reallyLongFunction( input: Int ) : Option[String] = { ..... } 使用scala并行集合,我可以轻松地做 inputValues.par.map( reallyLongFunction( _ ) ) 要得到所有的结果,并行.问题是,我不是真的想要所有的结果,我只想要FIRST的结果.一旦我的投入成功,我想要我的产出,并希望继续我的生活.这做了很多额外的工作. 那么如何才能获得两个世界的最好呢?我要 >获取从我的长功能返回的第一个结果 编辑 – @volatile var done = false; 哪个设置和检查我的真正的LongFunction.这有效,但感觉不舒服.想要一个更好的方法来做这个…. 解决方法
我以与huynhjl相同的方式解释了你的问题,但是如果你只想搜索和丢弃None,你可以这样做,以避免在找到合适的结果时重复计算:
class Computation[A,B](value: A,function: A => B) { lazy val result = function(value) } def f(x: Int) = { // your function here Thread.sleep(100 - x) if (x > 5) Some(x * 10) else None } val list = List.range(1,20) map (i => new Computation(i,f)) val found = list.par find (_.result.isDefined) //found is Option[Computation[Int,Option[Int]]] val result = found map (_.result.get) //result is Option[Int] 但是对于并行集合来说,似乎做了很多不必要的工作(参见this question),所以这可能无法正常工作,至少与当前版本的Scala. 在并行集合中使用了挥发性标志(看看find,exists和forall的来源),所以我认为你的想法是一个好的.实际上,如果您可以在该函数本身中包含该标志,那就更好了.它会对您的功能造成参照透明度(即某些输入,您的功能现在有时会返回None而不是某些),但是由于您丢弃了停止的计算,所以这并不重要. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |