【问题标题】:Is blocking within a future still blocking?未来的阻塞仍然阻塞吗?
【发布时间】:2013-09-24 17:35:21
【问题描述】:

阻塞不好,异步好,但是在未来阻塞仍然阻塞吗?这是我不断回来的东西;考虑以下伪代码:

def queryName(id:Id):Future[String]
def queryEveryonesNames:Future[Seq[String]] = {
  val everyonesIds:Future[Seq[Id]] = getIds
  val everyonesNames:Future[Seq[Future[String]]] = {
    everyonesIds.map(seq.map(id=>queryName(id)))
  }
  // I'm trying to understand the impact of what I'll do below
  everyonesNames.map(seq=>seq.map(fut=>blocking(fut, 1 s)))
}
queryEveryonesNames

在最后一行中,我通过 上的 blockingFuture[Seq[Future[String]]](注意 futurefuture 中)转换为 Future[Seq[String]]内心的未来

在未来中阻止未来感觉是多余的,至少在这里是这样,但在未来中拥有未来也感觉多余。

你能提出一个更聪明的方法来摆脱内心的未来吗?

你认为在未来中阻止未来是不好的吗?如果是,为什么以及在什么情况下?

【问题讨论】:

    标签: scala asynchronous concurrency blocking future


    【解决方案1】:

    是的,未来的阻塞就是阻塞,你应该避免这种情况,因为资源将被阻塞以等待结果,即使它们在另一个线程中。
    如果我理解正确,您的问题是如何以非阻塞方式将Future[Seq[Future[String]]] 转换为Future[Seq[String]]

    你可以通过理解来做到这一点:

    val in =  Future[Seq[Future[String]]]
    val m = for( a <- in ) // a is Seq[Future[String]]
    yield ( Future.sequence(a)) // yields m = Future[Future[Seq[String]]]
    val result = for(a <- m; b <- a) yield (b) // yields Future[Seq[String]]
    

    编辑: 或者只是:

    val result = in.flatMap(a => Future.sequence(a))
    

    【讨论】:

    • 你应该只用in.flatMap( Future.sequence )得到同样的结果
    • Future 伴生对象有一些非常有用的方法,谢谢介绍。干杯!
    猜你喜欢
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多