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
的东西。
基本上我的意思是:
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
的东西。