基本上我是说:
for(v <- Future(long time operation)) yield v*someOtherValue
此表达式返回另一个Future
,但问题是v*someOhterValue
操作是否是惰性的?该表达式会阻塞获取Future(long time operation)
的值吗?
还是像一连串的回调?
答案 0 :(得分:3)
简短的实验可以测试这个问题。
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
或类似操作的行为不会受到阻碍。
答案 1 :(得分:2)
Future上的映射(或等效地,您的理解)不是不是惰性的:它将尽快在另一个线程上执行。但是,由于它在另一个线程上运行,因此也不会阻塞。
答案 2 :(得分:0)
如果要分别进行Future的定义和执行,则必须使用Monix Task
之类的东西。