我有一个简单的程序来使用 ExecutionContext.Implicits.global 中的期货来执行阻塞 IO。我想对执行此 IO 100 次的性能进行基准测试,但我的循环在所有未来完成之前结束。有没有办法仅在推送到 ExecutionContext 的所有任务完成时才终止?
问问题
225 次
1 回答
1
在没有任何代码的情况下,我将提供一个简单的版本,但需要注意的是,这是一种不准确的测量方式,对于需要少量时间的事情来说不是很好。仅当您的测量操作实际上需要相当长的时间时才真正有用,因此大部分时间都花在 Future 而不是测试代码中。
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 消耗所有线程。
于 2015-02-25T03:58:49.983 回答