我有一个简单的程序,可以在ExecutionContext.Implicits.global中使用期货来阻止IO。我想对执行此IO的性能进行基准测试100次,但我的循环在所有未来完成之前结束。有没有办法只在推送到ExecutionContext的所有任务完成后终止?
答案 0 :(得分:1)
在没有任何代码的情况下,我会提供一个简单的版本,但请注意,这是一种不准确的测量方法,对于花费少量时间的事情并不是很好。只有当你的测量操作实际需要花费相当多的时间才能真正有用,所以大部分时间花在未来而不是测试代码中。
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消耗所有线程。