阻止糟糕,异步好,但是在未来仍然阻塞的阻塞?这是我不断回归的事情;考虑遵循伪代码:
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
在最后一行中,我通过阻止将Future[Seq[Future[String]]]
(未来中的未来)转变为Future[Seq[String]]
内心的未来。
在未来阻碍未来感觉多余,至少在这里,但在未来拥有未来也会感到多余。
你能提出一种更聪明的方法来摆脱内心的未来吗?
你认为阻碍未来未来的发展是不是很糟糕?如果是这样,为什么以及在什么情况下?
答案 0 :(得分:8)
是的,未来阻止是阻塞的,你应该避免这种情况,因为资源将被阻止等待结果,即使它们在另一个线程中。
如果我理解正确,您的问题是如何以非阻塞的方式将Future[Seq[Future[String]]]
转换为Future[Seq[String]]
。
你可以用for-comprehensions做到这一点:
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))