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

Scala平行收藏 – 如何早点回报?

发布时间:2020-12-16 09:17:57 所属栏目:安全 来源:网络整理
导读:我有一个可能的输入值的列表 val inputValues = List(1,2,3,4,5) 我有一个很长的计算功能给我一个结果 def reallyLongFunction( input: Int ) : Option[String] = { ..... } 使用scala并行集合,我可以轻松地做 inputValues.par.map( reallyLongFunction( _ )
我有一个可能的输入值的列表

val inputValues = List(1,2,3,4,5)

我有一个很长的计算功能给我一个结果

def reallyLongFunction( input: Int ) : Option[String] = { ..... }

使用scala并行集合,我可以轻松地做

inputValues.par.map( reallyLongFunction( _ ) )

要得到所有的结果,并行.问题是,我不是真的想要所有的结果,我只想要FIRST的结果.一旦我的投入成功,我想要我的产出,并希望继续我的生活.这做了很多额外的工作.

那么如何才能获得两个世界的最好呢?我要

>获取从我的长功能返回的第一个结果
>停止我所有的其他线程无用的工作.

编辑 –
我像一个愚蠢的java程序员一样解决了它

@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而不是某些),但是由于您丢弃了停止的计算,所以这并不重要.

(编辑:李大同)

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

    推荐文章
      热点阅读