Scala 未来的阻塞仍然是阻塞吗?

Scala 未来的阻塞仍然是阻塞吗?,scala,asynchronous,concurrency,blocking,future,Scala,Asynchronous,Concurrency,Blocking,Future,阻塞不好,异步良好,但将来的阻塞是否仍然阻塞?这是我不断重复的事情;考虑下面的伪代码: 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.

阻塞不好,异步良好,但将来的阻塞是否仍然阻塞?这是我不断重复的事情;考虑下面的伪代码:

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中的Future)转换为
Future[Seq[String]]]
,方法是对内部Future进行阻塞

在未来中封锁未来让人觉得是多余的,至少在这里是这样,但在未来中拥有未来也让人觉得是多余的

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


你认为在未来内部封锁未来是不好的吗?如果是,为什么以及在什么情况下?

是的,未来的阻塞就是阻塞,您应该避免这种情况,因为资源将被阻塞以等待结果,即使它们在另一个线程中。
如果我理解正确,您的问题是如何以非阻塞方式将
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]]

使用.flatMap(Future.sequence)中的
应该会得到相同的结果。
Future伴随对象有一些非常有用的方法,感谢您的介绍。干杯
val result = in.flatMap(a => Future.sequence(a))