我有一个简单的程序来使用ExecutionContext.Implicits.global中的期货来执行阻塞IO。我想对执行此IO的性能进行100次测试,但是我的循环在所有未来完成之前就结束了。是否有一种方法仅在所有推送到ExecutionContext的任务完成时才终止?
发布于 2015-02-25 03:58:49
在没有任何代码的情况下,我将提供一个简单的版本,但请注意,这是一种不准确的测量方法,对于花费很少时间的事情来说不是很好。只有当你的测量需要相当长的时间,所以大部分时间都花在未来,而不是在测试代码中,这才是真正有用的。
import scala.concurrent._
import scala.concurrent.duration._
import ExecutionContext.Implicits.global
val myList = (1 to 10)
val start = System.currentTimeMillis
val seqFutures = for (elem <- myList) yield {
Future {
Thread.sleep(5000) // blocking operation
}
}
val result = Future.sequence(seqFutures)
Await.result(result, 30.seconds)
val end = System.currentTimeMillis
println(s"${end-start} seconds")如果要有大量的阻塞IO调用,那么配置一个单独的执行上下文是值得的,该上下文仅为阻塞IO配置一个更大的线程池,以避免阻塞IO消耗所有线程。
https://stackoverflow.com/questions/28710091
复制相似问题