scala.concurrent.Future 什么时候开始执行?
When scala.concurrent.Future's execution starts?
当然可以在 Future 主体的第一行收集系统时间。但是:
是否可以在不访问未来代码的情况下知道那个时间。 (在我的例子中,返回未来的方法将由 'framework' 的用户提供。)
def f: Future[Int] = ...
def magicTimePeak: Long = ???
Future
本身并不知道这一点(它也不是为了关心)。代码真正执行的时间完全取决于执行者。这取决于线程是否立即可用,如果不可用,则线程何时可用。
我想您可以将 Future
换行以跟踪它。这将涉及创建一个底层 Future
和一个闭包,该闭包更改包装的 class 中的可变变量。由于您只想要 Long
,如果 Future
尚未开始执行,则它必须默认为零,尽管将其更改为 Option[Date]
或其他东西是微不足道的。
class WrappedFuture[A](thunk: => A)(implicit ec: ExecutionContext) {
var started: Long = 0L
val underlying = Future {
started = System.nanoTime / 1000000 // milliseconds
thunk
}
}
为了证明它的工作原理,创建一个只有一个线程的固定线程池,然后为其提供一个阻塞任务,比如 5 秒。然后,创建一个 WrappedFuture
,稍后检查它的 started
值。请注意记录时间的差异。
import java.util.concurrent.Executors
import scala.concurrent._
val executorService = Executors.newFixedThreadPool(1)
implicit val ec = ExecutionContext.fromExecutorService(executorService)
scala> println("Before blocked: " + System.nanoTime / 1000000)
Before blocked: 13131636
scala> val blocker = Future(Thread.sleep(5000))
blocker: scala.concurrent.Future[Unit] = scala.concurrent.impl.Promise$DefaultPromise@7e5d9a50
scala> val f = new WrappedFuture(1)
f: WrappedFuture[Int] = WrappedFuture@4c4748bf
scala> f.started
res13: Long = 13136779 // note the difference in time of about 5000 ms from earlier
但是,如果您不控制 Future
的创建,则您无法确定它何时开始。
当然可以在 Future 主体的第一行收集系统时间。但是:
是否可以在不访问未来代码的情况下知道那个时间。 (在我的例子中,返回未来的方法将由 'framework' 的用户提供。)
def f: Future[Int] = ...
def magicTimePeak: Long = ???
Future
本身并不知道这一点(它也不是为了关心)。代码真正执行的时间完全取决于执行者。这取决于线程是否立即可用,如果不可用,则线程何时可用。
我想您可以将 Future
换行以跟踪它。这将涉及创建一个底层 Future
和一个闭包,该闭包更改包装的 class 中的可变变量。由于您只想要 Long
,如果 Future
尚未开始执行,则它必须默认为零,尽管将其更改为 Option[Date]
或其他东西是微不足道的。
class WrappedFuture[A](thunk: => A)(implicit ec: ExecutionContext) {
var started: Long = 0L
val underlying = Future {
started = System.nanoTime / 1000000 // milliseconds
thunk
}
}
为了证明它的工作原理,创建一个只有一个线程的固定线程池,然后为其提供一个阻塞任务,比如 5 秒。然后,创建一个 WrappedFuture
,稍后检查它的 started
值。请注意记录时间的差异。
import java.util.concurrent.Executors
import scala.concurrent._
val executorService = Executors.newFixedThreadPool(1)
implicit val ec = ExecutionContext.fromExecutorService(executorService)
scala> println("Before blocked: " + System.nanoTime / 1000000)
Before blocked: 13131636
scala> val blocker = Future(Thread.sleep(5000))
blocker: scala.concurrent.Future[Unit] = scala.concurrent.impl.Promise$DefaultPromise@7e5d9a50
scala> val f = new WrappedFuture(1)
f: WrappedFuture[Int] = WrappedFuture@4c4748bf
scala> f.started
res13: Long = 13136779 // note the difference in time of about 5000 ms from earlier
但是,如果您不控制 Future
的创建,则您无法确定它何时开始。