【发布时间】:2016-05-11 18:25:01
【问题描述】:
假设我有以下一组在 Future 中执行某些操作的代码:
1 to 10 foreach {
case x => Future { x + x }
}
假设我给这段代码默认的ExecutionContext,我知道后台发生了什么,但我想知道的是Future的处理到底是怎么做的?我的意思是应该有一些线程或一组线程可能正在等待 Future 完成?这些线程被阻塞了吗?从某种意义上说,他们正在等待 Future 完成?
现在在以下场景中:
val x: Future[MyType] = finishInSomeFuture()
假设 x 有一个超时,我可以这样调用:
Future {
blocking {
x.get(3, TimeOut.SECONDS)
}
}
我真的在阻止吗?有没有更好的异步超时方法?
编辑:以下 Timeout 与我上面定义的阻塞上下文相比有何不同或更好?
object TimeoutFuture {
def apply[A](timeout: FiniteDuration)(block: => A): Future[A] = {
val prom = promise[A]
// timeout logic
Akka.system.scheduler.scheduleOnce(timeout) {
prom tryFailure new java.util.concurrent.TimeoutException
}
// business logic
Future {
prom success block
}
prom.future
}
}
【问题讨论】:
-
ExecutionContext 使用具有窃取语义的 ForkJoinPool。阅读:blog.jessitron.com/2014/02/…
-
@Mika'il 假设您使用的是默认执行上下文并且不提供自己的池
-
x.get方法是什么?你用的是scala内置的Futures吗? -
假设我有一种方法,比如在给定的持续时间内获取那种块。我想知道如何在不阻塞的情况下超时?