Future 地图是否懒惰?

Is map of Future lazy or not?

基本上我的意思是:

for(v <- Future(long time operation)) yield v*someOtherValue

这个表达式returns又是一个Future,但问题是,v*someOhterValue操作是惰性的还是不惰性的?此表达式会阻止获取 Future(long time operation) 的值吗?

或者它就像一连串的回调?

一个简短的实验可以测试这个问题。

import concurrent._;
import concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._

object TheFuture {

  def main(args: Array[String]): Unit = {
    val fut = for (v <- Future { Thread.sleep(2000) ; 10 }) yield v * 10;
    println("For loop is finished...")
    println(Await.ready(fut, Duration.Inf).value.get);
  }

}

如果我们 运行 这个,我们几乎会立即看到 For loop is finished...,然后两秒钟后,我们会看到结果。因此,对未来执行 map 或类似操作的行为不会阻塞。

Future 上的映射(或者,等效地,您的 for 理解)不是 惰性:它将尽快在另一个线程上执行。但是,由于它在另一个线程上运行,因此它也不会阻塞。

如果你想单独定义和执行 Future,那么你必须使用类似 Monix Task 的东西。

https://monix.io/api/3.0/monix/eval/Task.html