在未来阻止仍然阻塞?

Dom*_*kis 3 concurrency asynchronous scala future blocking

阻止坏,异步好,但在未来阻止仍然阻塞?这是我不断回归的事情; 考虑遵循伪代码:

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
Run Code Online (Sandbox Code Playgroud)

在最后一行我接通Future[Seq[Future[String]]](通知将来将来)进入Future[Seq[String]]阻塞内部未来.

阻碍未来的未来感觉多余,至少在这里,但在未来拥有未来也感到多余.

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

你认为阻碍未来的未来是坏事吗?如果是这样的原因和在什么情况下?

Vin*_*ana 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]]
Run Code Online (Sandbox Code Playgroud)

编辑: 或者只是:

val result = in.flatMap(a => Future.sequence(a))
Run Code Online (Sandbox Code Playgroud)

  • 你应该只用`in.flatMap(Future.sequence)`得到相同的结果 (2认同)