Await.ready 真的阻塞了主线程吗?
Is Await.ready really blocking main thread?
我在 Scala 中有一段代码,其中我在主块中使用 Await.ready
,然后使用相应的值。
import scala.concurrent.{Future, Await}
import scala.concurrent.duration.Duration
import scala.concurrent.ExecutionContext.Implicits.global
import concurrent.Promise
val a = Future[Int] {
Thread.sleep(100)
4+6
}
val b = Future[Int] {
12
}
val r1= Await.ready(a,Duration.Inf)
val r2=Await.ready(b,Duration.Inf)
println("a = " + a)
println("b = " + b)
val k = b.flatMap(x => {a.map(y => x+y)})
println("k = " + k)
这导致
a = Future(Success(10))
b = Future(Success(12))
k = Future(<not completed>)
为什么 k
没有计算出来?
val k = b.flatMap(x => {a.map(y => x+y)})
println("k = " + k)
k
是将在后台计算的 Future。结果不会出现在下一行。
在你的例子中,你已经等待 b
和 a
完成,所以 k
的计算实际上不会花费任何时间,但一些后台执行程序会还需要评估 flatMap
.
因此您还需要Await.result(k)
。
我在 Scala 中有一段代码,其中我在主块中使用 Await.ready
,然后使用相应的值。
import scala.concurrent.{Future, Await}
import scala.concurrent.duration.Duration
import scala.concurrent.ExecutionContext.Implicits.global
import concurrent.Promise
val a = Future[Int] {
Thread.sleep(100)
4+6
}
val b = Future[Int] {
12
}
val r1= Await.ready(a,Duration.Inf)
val r2=Await.ready(b,Duration.Inf)
println("a = " + a)
println("b = " + b)
val k = b.flatMap(x => {a.map(y => x+y)})
println("k = " + k)
这导致
a = Future(Success(10))
b = Future(Success(12))
k = Future(<not completed>)
为什么 k
没有计算出来?
val k = b.flatMap(x => {a.map(y => x+y)})
println("k = " + k)
k
是将在后台计算的 Future。结果不会出现在下一行。
在你的例子中,你已经等待 b
和 a
完成,所以 k
的计算实际上不会花费任何时间,但一些后台执行程序会还需要评估 flatMap
.
因此您还需要Await.result(k)
。